我可以在MongoDB的深层嵌套文档上使用findAndModify之类的东西吗?

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用户添加(或删除)角色

Leo*_*tny 5

是的,有可能。您可以使用updatefindAndModify命令来完成。

要将角色添加到用户调用:

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)

updatefindAndModify命令之间唯一真正的区别是,它findAndModify返回修改后的文档,而update仅返回操作状态。

findAndModify操作等效于同时调用findupdate操作,除了findAndModify在单个事务中执行两项操作。有关更多信息,请参见此问题