Могу ли я использовать что-то вроде findAndModify в документе с глубоким вложением с MongoDB?
У меня есть контексты Collection с документами, подобными приведенным в моем MongoDB (в контексте есть пользователи с ролями)
{
"__v" : 0,
"_id" : ObjectId("53dea71a713d636e1fea705a"),
"name" : "team4",
"users" : [
{
"userId" : "53a347467f311d7c1731f91b",
"roles" : [
"admin"
]
},
{
"userId" : "536d2e8be0f9697e13b95c87",
"roles" : []
}
]
}
Есть ли способ добавить (или удалить) роль для пользователя с помощью findAndModify.
1 ответ
Да, это возможно. Вы можете сделать это, используя команды update и findAndModify.
Чтобы добавить роль к вызову пользователя:
db.contexts.update({
_id: ObjectId('53dea71a713d636e1fea705a'),
'users.userId': '536d2e8be0f9697e13b95c87'
}, {
$push: {
'users.$.roles': 'admin'
}
})
Чтобы удалить роль из пользовательского вызова:
db.contexts.update({
_id: ObjectId('53dea71a713d636e1fea705a'),
'users.userId': '53a347467f311d7c1731f91b'
}, {
$pull: {
'users.$.roles': 'admin'
}
})
Обратите внимание, что я использую позиционный оператор$
указать точное user
поддокумент для обновления.
Вот пример использования findAndModify
для той же задачи:
db.contexts.findAndModify({
query: {
_id: ObjectId('53dea71a713d636e1fea705a'),
'users.userId': '536d2e8be0f9697e13b95c87'
},
update: {
$push: {
'users.$.roles': 'admin'
}
},
new: true
})
Единственная реальная разница между update
а также findAndModify
Команды в том, что findAndModify
возвращает вам измененный документ, в то время как update
возвращает только рабочее состояние.
findAndModify
операция эквивалентна вызову обоих find
а также update
операции, кроме этого findAndModify
выполняет обе операции в одной транзакции. Для получения дополнительной информации см этот вопрос.