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

时间:2014-08-18 12:04:07

标签: mongodb findandmodify

我的收藏上下文包含MongoDB中的以下文档(上下文有一些用户 角色

{
    "__v" : 0,
    "_id" : ObjectId("53dea71a713d636e1fea705a"),
    "name" : "team4",
    "users" : [ 
        {
            "userId" : "53a347467f311d7c1731f91b",
            "roles" : [ 
                "admin"
            ]
        }, 
        {
            "userId" : "536d2e8be0f9697e13b95c87",
            "roles" : []
        }
    ]
}

是否可以使用findAndModify用户添加(或删除)角色

1 个答案:

答案 0 :(得分:4)

是的,这是可能的。您可以使用updatefindAndModify命令执行此操作。

要为用户调用添加角色:

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'
  }
})

请注意,我使用positional operator $指定了一个精确的user子文档 更新

以下是将findAndModify用于同一任务的示例:

db.contexts.findAndModify({
  query: {
    _id: ObjectId('53dea71a713d636e1fea705a'),
    'users.userId': '536d2e8be0f9697e13b95c87'
  },
  update: {
    $push: {
      'users.$.roles': 'admin'
    }
  },
  new: true
})

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

除了findAndModify在单个事务中执行两个操作外,

find操作相当于调用updatefindAndModify个操作。有关详细信息,请参阅this question