Возможно, вы захотите добавить вспомогательный массив, который отслеживает пользователей в документе user
:
{
_id: 1,
score: [
{
foo: 'a',
bar: 0,
users: ["user1", "user2"],
user: {user1: 0, user2: 7}
}
]
}
Затем вы можете добавлять новых пользователей атомарно:
> db.test.update({_id: 1, score: { $elemMatch: {bar: 0}}},
... {$set: {'score.$.user.user3': 10}, $addToSet: {'score.$.users': "user3"}})
Удалить пользователей:
> db.test.update({_id: 1, score: { $elemMatch: {bar: 0}}},
... {$unset: {'score.$.user.user3': 1}, $pop: {'score.$.users': "user3"}})
Оценка запросов:
> db.test.find({_id: 1, score: {$elemMatch: {bar: 0, users: {$not: {$size: 0}}}}})
Если вы знаете, что будете добавлять только несуществующих пользователей и удалять существующих пользователей из документа user
, вы можете упростить users
до счетчика, а не массива, но приведенный выше более устойчив.