MongoDB: Как обновить поле элемента массива в зависимости от другого поля? - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь обновить данные в моем MongoDB (4.2), используя обновление с конвейером. Сложность в том, что я хочу добавить поле в элемент массива в зависимости от другого поля. Также я хочу сделать это для каждого элемента. Я знаю, что могу сделать по Javascript для каждого, но мне было интересно, есть ли лучший способ. Вот что я хочу сделать в качестве примера

До:

{
    "_id" : ObjectId("555555555"),
    "messages" : [
        {
            "author" : {
                "userId" : "12345",
                "name" : "John"
            },
            "text" : "Any text",
        },
        {
            "author" : {
                "userId" : "56789",
                "name" : "Jim"
            },
            "text" : "also text"
        }
    ]
}

После

{
    "_id" : ObjectId("555555555"),
    "messages" : [
        {
            "author" : {
                "userId" : "12345",
                "name" : "John",
                "newId" : "00012345"
            },
            "text" : "Any text",
        },
        {
            "author" : {
                "userId" : "56789",
                "name" : "Jim",
                "newId" : "00056789"
            },
            "text" : "also text"
        }
    ]
}

Что я пробовал:

db.mail.update(
   {"_id" : ObjectId("555555555")},
  [{ $set: { "messages.$[].author.newId": { $concat: [ "000", "$messages.$[].author.userId"]}}}],
  { multi: true, writeConcern: {w: 0} }
)

Кто-нибудь знает, как решить эту проблему? Спасибо

1 Ответ

2 голосов
/ 14 февраля 2020

Это сделает необходимое обновление.

db.test.update(
  { _id : ObjectId("555555555") },
  [ 
    { 
      $set: { 
          messages: {
              $map: {
                   input: "$messages",
                   in: {
                       $mergeObjects: [
                           "$$this",
                           { "author": { 
                                  $mergeObjects: [ 
                                       "$$this.author", 
                                       { newId: { $concat: [ "000", "$$this.author.userId"] } } 
                                   ]
                           } }
                       ]
                   }
              } 
          }
      }
    }
  ],
  { multi: true, writeConcern: {w: 0} }
)

Обратите внимание, что весь позиционный оператор $[] для обновлений массива должен использоваться с операциями обновления, когда не используется агрегация. Вы должны использовать агрегацию для обновления, когда значение поля зависит от другого поля в документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...