2016-10-18 92 views
1

可以说我有一个集合的文档“MyCollection的”结构是这样的:MongoDB的更新与位置操作

{ 
    _id: ..., 
    Items: [ 
     { 
     Field1: ..., 
     Field2:..., 
     Value: 0 
     } 
    ] 
} 

我想,当我得到_id匹配更新域“值”,项目.Field1和Item.Field2。

这里是我的查询:

db['myCollection'].update({ 
     "_id" : BinData(3, "xxx"), 
     "Items.Field1" : ISODate("2016-05-01T00:00:00.000+0000"), 
     "Items.Field2" : BinData(3, "yyy") 
    }, 
    { 
     $set : { 
      "Items.$.Value" : NumberInt(11) 
     } 
    } 
) 

有时它的工作原理,有时该字段值不更新,包含下列反应:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) 

该项目已经被发现,但没有被修改过? ...

据我了解“$”在这种情况下,我认为数组的索引是正确的,但也许问题是关于“_id”标准?

我怀疑$ set表达式是错误的:也许我错过了一些东西以确保$ set的目标文件在哪里{“_id”:BinData(3,“xxx”)}?

非常感谢

编辑 看来,writeResult.Modified是假的,因为需要修改的字段已设定的值。 实际上,对于任何Field1和Field2条件,更改的项目总是相同的:在我的情况下Items.0.Value。 难道是因为第一个标准“_id”不是该项目数组的一部分吗?

编辑 在我看来,该字段2标准被重写字段1一个:如果我只保留其中之一,它是考虑到正常。 但是,如果我把它们都放在一起,就好像第一个被滑过...

回答

0

好的。经过进一步调查,我发现这个问题:我需要用的,因为我已经奥安我阵列的多个标准$ elemMatch操作:

查询部分是这样的:

{ 
    "_id" : BinData(3, "xxx"), 
    "Items" : { 
     $elemMatch { 
      "Field1": ISODate("2016-05-01T00:00:00.000+0000"), 
      "Field2" : BinData(3, "yyy") 
    }} 

} 

感谢那些谁花时间读书。希望这可以帮助。

如果有人解释了在这种情况下我们必须使用$ elemMatch的原因,我非常感兴趣!