我想原子地删除数组字段的前n个元素。
现在,我使用model.find()
,然后使用doc.arrayField.slice(n)
,然后使用doc.save()
。但这会将整个文档加载到内存中(如果文档非常大,则会很糟糕),这会破坏原子性。
有没有办法在MongoDB / Mongoose中原子地实现这个?
谢谢!
答案 0 :(得分:1)
您可以使用$pop
以原子方式删除第一个元素。或者,如果您可以指定要删除的字段,则可以使用$pull
从阵列中删除多个项目。否则,您无法使用mongodb在原子操作中从数组中删除前n个元素。
db.yourCollection.update({}, {$pop: {arrayField: 1}}}) // will remove the first element from arrayField
db.yourCollection.update({}, {$pull: {arrayField: {foo: "bar"}}}}) // will remove all elements whose foo field equal to bar from arrayField.
答案 1 :(得分:0)
MongoDB为数组更新提供$slice
运算符。 https://docs.mongodb.org/v3.0/reference/operator/update/slice/
您也可以在Mongoose updateClause中使用。
答案 2 :(得分:0)
您可以将$slice与项目文档一起使用,而不是将所有arrayField数据加载到内存中,而不是像这样使用arrayFields的前n个元素
model.find({}, {arrayField : {$slice: n}}) // n is first n elements
现在您可以使用
删除这些n个元素doc.arrayField.slice(n);
doc.save();