koa*_*der 1 mongodb findandmodify
我的MongoDB 中具有类似以下文档的Collection 上下文(上下文中有一些具有角色的用户)
{
"__v" : 0,
"_id" : ObjectId("53dea71a713d636e1fea705a"),
"name" : "team4",
"users" : [
{
"userId" : "53a347467f311d7c1731f91b",
"roles" : [
"admin"
]
},
{
"userId" : "536d2e8be0f9697e13b95c87",
"roles" : []
}
]
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用findAndModify向用户添加(或删除)角色。
是的,有可能。您可以使用update和findAndModify命令来完成。
要将角色添加到用户调用:
db.contexts.update({
_id: ObjectId('53dea71a713d636e1fea705a'),
'users.userId': '536d2e8be0f9697e13b95c87'
}, {
$push: {
'users.$.roles': 'admin'
}
})
Run Code Online (Sandbox Code Playgroud)
要从用户呼叫中删除角色:
db.contexts.update({
_id: ObjectId('53dea71a713d636e1fea705a'),
'users.userId': '53a347467f311d7c1731f91b'
}, {
$pull: {
'users.$.roles': 'admin'
}
})
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用位置运算符$
来指定user
要更新的确切子文档。
这是findAndModify
用于同一任务的示例:
db.contexts.findAndModify({
query: {
_id: ObjectId('53dea71a713d636e1fea705a'),
'users.userId': '536d2e8be0f9697e13b95c87'
},
update: {
$push: {
'users.$.roles': 'admin'
}
},
new: true
})
Run Code Online (Sandbox Code Playgroud)
update
和findAndModify
命令之间唯一真正的区别是,它findAndModify
返回修改后的文档,而update
仅返回操作状态。
findAndModify
操作等效于同时调用find
和update
操作,除了findAndModify
在单个事务中执行两项操作。有关更多信息,请参见此问题。