2011-12-03 41 views
0

在我的收藏的文件rooms具有以下結構:

{ 
    "_id": { "$oid": "4edaaa4a8d285b9311eb63ab" }, 

    "users": [ 
     { 
      "userId": { "$oid": "4edaaa4a8d285b9311eb63a9" }, 
      "unreadMessages": 0 
     }, 

     { 
      "userId": { "$oid": "4edaaa4a8d285b9311eb63aa" }, 
      "unreadMessages": 0 
     }, 
    ] 
} 

我想在遞增所述第二用戶(一個unreadMessages索引1該陣列),如果我知道第一個用戶的ObjectId。知道該文檔的_id已足夠選擇,但爲了更新,我需要能夠引用其他用戶,所以我還通過users進行了選擇。我用下面的更新調用這樣做:

collections.rooms.update(
    { 
     _id: ObjectId("4edaaa4a8d285b9311eb63ab"), 

     users: {   // not first user 
      $elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } } 
     } 
    }, 

    { 
     // this should increment second user's unreadMessages, 
     // but does so for unreadMessages of first user 
     $inc: { "users.$.unreadMessages": 1 } 
    } 
); 

它增加第一用戶的unreadMessages,而不是第二個用戶。我想這是因爲$ne實際上匹配第一個用戶,顯然這就是users.$所指的。

我應該如何修改此通話以使第二個用戶的unreadMessages增加?

回答

2

我認爲你做的是正確的,除了圍繞$ne查詢約束的一點語法誦讀困難症。

所以,你必須

users: {   // not first user 
    $elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } } 
} 

,而不是你想

users: {   // not first user 
    $elemMatch: { userId: { $ne: ObjectId("4edaaa4a8d285b9311eb63a9") } } 
} 

如果我假如每次我做同一種交換時間的鎳......我有一個很多鎳。 :)

實際上,如果你想收緊,$ elemMatch並不是真的需要,因爲你只是約束匹配的數組元素的一個屬性。我認爲你可以將整個查詢條件歸結爲:

{ 
    _id: ObjectId("4edaaa4a8d285b9311eb63ab"), 
    users.userId: { $ne : ObjectId("4edaaa4a8d285b9311eb63a9") } 
} 
+0

我不得不交換。雖然,'$ elemMatch'似乎是必要的,因爲它沒有更新。一切正在工作,謝謝! – pimvdb

相關問題