Могу ли я использовать что-то вроде 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 выполняет обе операции в одной транзакции. Для получения дополнительной информации см этот вопрос.

Другие вопросы по тегам