Created
September 30, 2019 18:34
-
-
Save alexbaumgertner/a696c53bac741221f59d5f9093fdf512 to your computer and use it in GitHub Desktop.
Mongo reorder list
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* model - `Item` | |
* order property — `order` | |
*/ | |
const changeOrder = async (req, res) => { | |
try { | |
const { itemId } = req.params | |
const orderOnClient = Number(req.body.order) | |
const items = await Item.find({}) | |
.sort({ order: 1 }) | |
.lean() | |
.exec() | |
// Find place where reordered Item will be replaced | |
const newOrder = items[orderOnClient - 1].order | |
const updatingItem = await Item.update({ _id: itemId }, { order: newOrder }) | |
.lean() | |
.exec() | |
// Reorder other items according order changes | |
let query | |
let data | |
if (updatingItem.order > newOrder) { | |
// updatingItem was moved up | |
query = { | |
_id: { $nin: itemId }, | |
order: { | |
$gte: newOrder, | |
$lt: updatingItem.order, | |
}, | |
} | |
data = { $inc: { order: 1 } } | |
} else { | |
// updatingItem was moved down | |
query = { | |
_id: { $nin: itemId }, | |
order: { | |
$gt: updatingItem.order, | |
$lte: newOrder, | |
}, | |
} | |
data = { $inc: { order: -1 } } | |
} | |
await Item.updateMany(query, data) | |
.lean() | |
.exec() | |
const updatedItems = await Item.find({}) | |
.sort({ order: 1 }) | |
.lean() | |
.exec() | |
res.json(updatedItems) | |
} catch (e) { | |
res.status(500) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment