2016-03-13 41 views
0

嗨,我是新來的mongoDB,我有一個訂單集合這樣。正確的查詢更新嵌套元素MongoDB

{ 
    "_id" : ObjectId("11111111111111"), 
    "stops" : [ 
     { 
      "_id" : ObjectId("222222222222222"), 
      "status" : "IN PROGRESS" 
     }, 
     { 
      "_id" : ObjectId("33333333333333"), 
      "status" : "PENDING" 
     }] 
} 

我想更新的記錄的停止狀態的順序id = "11111111111111"和 停止id = "222222222222222"到處理完畢。

我搜索在德INTERENT與這樣

db.order.update(
    {'_id': ObjectId("11111111111111"), 'stops._id': ObjectId("222222222222222")}, 
    $set: { 
      'stops.$.status': "DONE", 
     } 
); 

我的問題是

在它使用 'stops._id'查詢

但是當我們更新字段,它使用'stops.$.status'

查詢想出了這是不正確的,如果我使用'stops.status' ??

我在網上搜索了很多東西,答案和文章讓我感到困惑。

所以任何人都可以解釋我什麼是正確的方式和點符號和$操作符之間的區別。

預先感謝您。

回答

1

$運算符根據其所使用的上下文而有所不同。通常,它用於代替數組索引。

在這裏,您正在使用它在update查詢。這意味着您將更新匹配搜索條件的第一個元素。在這裏,你的標準是{'_id': ObjectId("11111111111111"), 'stops._id': ObjectId("222222222222222")}。無需使用$運算符即可使用stops._id,因爲MongoDB將搜索具有指定ObjectID的每個停止元素(即,它從不需要特定索引)。在指定$set時,$操作符告訴MongoDB更新搜索返回的數組中的第一個文檔。由於您正在查詢一系列文檔,所以返回的結果將是一組文檔,即使它的長度爲1!簡而言之,在update查詢中,使用$運算符代替特定索引。應該注意的是,如果您嘗試使用upsert或者如果使用否定運算符(例如$ne)搜索陣列,則不能使用它。

find查詢中,$操作符以幾乎相同的方式使用。這將導致查詢只返回數組的第一個元素(類似於關係數據庫中的投影)。值得注意的是,當以這種方式使用時,$操作符更受限制。查詢中只能使用一個$運算符,查詢中只能出現一個數組,並且只能計算一個條件。

需要注意的是,在任何情況下,$操作符都不能用於遍歷多個數組或嵌套數組。總而言之,$操作符是一種更具表現力的方式,可以訪問數組中的第一個也是唯一的第一個元素,而無需指定索引。您不能使用點符號代替它,因爲您需要索引。當你知道你總是會得到長度爲1或0的數組時,最好使用它。

官方文檔:update queryfind query