MongoDB - 使用node.js中的多个$ elemMatch运算符更新多个级别的子文档

时间:2014-11-10 18:02:43

标签: node.js mongodb

我对MongoDB很新,所以请怜悯我吧!我有一个看起来像这样的架构:

{
    "hour": 0,
    "minutes": [
        {
            "minute": 0,
            "minuteVolume": 0,
            "seconds": [
                {
                    "second": 0,
                    "secondVolume": 0
                },
                {
                    "second": 1,
                    "secondVolume": 0
                }
        },
        {
            "minute": 22,
            "minuteVolume": 0,
            "seconds": [
                {
                    "second": 0,
                    "secondVolume": 0
                },
                {
                    "second": 1,
                    "secondVolume": 0
                }
        }],
    "hourVolume": 0
}

我正在尝试更新特定的"secondVolume""minuteVolume"。我尝试过以下方法:

collection.update({"hour": hour, 
    "minutes": {$elemMatch: {"minute": minute}},
    "minutes.seconds": {$elemMatch: {"second": second}}},
            { $inc: {hourVolume: 1, "minutes.$.minuteVolume": 1, "minutes.$.minuteVolume.seconds.$.second": 1}
                },
        {upsert:false,safe:true},
        function(err,data){
            if (err){
                console.log(err);
            }
            else
                {
                console.log(data);
                }
        }
    );
  • 但我显然做错了什么。如果我删除了$elemMatch的{​​{1}}并且只尝试更新"second",那么它的工作方式就是groovy。这让我相信我对位置操作符做错了,或者我的查询没有正确展开文档。

在MongoDB中使用单个查询是否可以实现这一点?我使用mongodb驱动程序版本1.4.19。

提前多多感谢!

1 个答案:

答案 0 :(得分:2)

看起来你可以和我投票支持这个功能的240人。 https://jira.mongodb.org/browse/SERVER-831

如果您知道元素的位置(可能首先查询文档),您可以使用位置运算符而不是使用$ elemMatch来更新。

{ $inc: {hourVolume: 1, "minutes.0.minuteVolume": 1, "minutes.0.minuteVolume.seconds.2.second": 1 }

我不得不重做几个模式来防止多嵌套,因此允许一次更新。