0

我有一个表格的文件集合:

{ name:String, groceries:{ apples:Number, cherries:Number, prunes:Number } }

现在,每个查询我都必须为“杂货”中的每个元素增加正值和/或负值。什么键或多少并不重要,我只是添加了一些示例。

我可以做一个:

var dataToBeIncremented = stuff;
var $inc = {};
for each( var index in dataToBeIncremented )
{
    $inc[ "groceries." + index ] = dataToBeIncremented[ index ];
}

然后

db.update( { _id:targetID }, { $inc : query } )

但是,我可能有成千上万的杂货元素,并且发现在每次更新时执行此循环是丑陋且未优化的。

我想知道如何取消它或为什么它不能被优化。

4

1 回答 1

1

实际上没有办法避免它,因为没有这样的命令可以增加子文档中的所有值。

所以唯一的方法就是做你所做的事情:

{
    "$inc": {
        "groceries.apples" : 1, 
        "groceries.cherries" : 1,
        "groceries.prunes" : 1
    }
}

因为您不知道确切的字段是什么,所以您需要事先找到它们并创建 $inc 语句。这些更新有一个好处:无论您拥有多少元素,您仍然只需要 2 个查询(查找要更新的内容并实际执行更新)。

我也在考虑如何使用不同的模式获得更好的结果,但显然你必须应对你所拥有的。

于 2013-10-26T23:10:57.190 回答