2011-12-03 11 views
0

roomsは、次のような構造をしている私のコレクション内のドキュメント:

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

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

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

私は、インデックス1において第2のユーザ(1のunreadMessagesをインクリメントしたいのですが配列)、私が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.$が参照しているものです。

2番目のユーザーのunreadMessagesが増分されるようにこの呼び出しを変更する必要がありますか?

答えて

2

$neクエリ制約の周囲の小さな構文ディスレクシアを除いて、正しいことをしていると思います。

あなたは

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

を持っているので、代わりに私は、私はスワップの同じ種類をやったたびにニッケルを持っていた場合

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

が...私が持っていると思いたいですニッケルスがたくさんある。 :)

実際には、一致した配列要素の1つのプロパティを制約しているので、実際には、$ elemMatchは必要ありません。私はあなたが全体のクエリ基準を下げることができると思う:

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

私は本当に交換しなければならなかった。しかし、$ elemMatchは更新されていないので必要と思われます。ありがとうございました! – pimvdb

関連する問題