2016-10-18 52 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的原因,我非常感興趣!