Skip to content

Instantly share code, notes, and snippets.

@alexbaumgertner
Created September 30, 2019 18:34
Show Gist options
  • Save alexbaumgertner/a696c53bac741221f59d5f9093fdf512 to your computer and use it in GitHub Desktop.
Save alexbaumgertner/a696c53bac741221f59d5f9093fdf512 to your computer and use it in GitHub Desktop.
Mongo reorder list
/**
* 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