mongodb:原子地删除数组的前n个元素

时间:2015-12-22 19:27:58

标签: javascript arrays node.js mongodb mongoose

我想原子地删除数组字段的前n个元素。

现在,我使用model.find(),然后使用doc.arrayField.slice(n),然后使用doc.save()。但这会将整个文档加载到内存中(如果文档非常大,则会很糟糕),这会破坏原子性。

有没有办法在MongoDB / Mongoose中原子地实现这个?

谢谢!

3 个答案:

答案 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();