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

我对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 "second" ,只尝试更新"minuteVolume" ,它只是groovy。 这导致我相信我在位置操作符做错了什么,或者我的查询没有正确地解开文档。

这甚至可能在MongoDB中的单个查询? 我正在使用mongodb驱动程序版本1.4.19。

提前感谢!

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

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

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

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