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
が増分されるようにこの呼び出しを変更する必要がありますか?
私は本当に交換しなければならなかった。しかし、$ elemMatchは更新されていないので必要と思われます。ありがとうございました! – pimvdb