MongoDB $ установить элемент в массиве, который не существует с объектом, поскольку элемент приводит к объекту вместо массива - PullRequest
0 голосов
/ 06 мая 2019

Обновление элементов внутри массива объясняется здесь:

https://docs.mongodb.com/manual/reference/operator/update/set/#set-elements-in-arrays

Но в документах, кажется, отсутствует тот случай, когда массив еще не существует в документе. Пример:

Если есть этот документ:

{
  _id: 'some-id',
  otherprops: 'value'
}

И я хочу, чтобы это стало таким:

{
  // ...
  settings: {
    friends: [
      {
        name: 'John Doe',
        age: 28
      }
    ]
  }
  // ...
}

В этой ситуации я не знаю, существует ли уже массив settings.friends. Итак, мой запрос выглядит так:

{
  $set: {
    'settings.friends.0.name': 'John Doe',
    'settings.friends.0.age': 28
  }
}

Однако документ выглядит так:

{
  // ...
  settings: {
    friends: {
      0: {
        name: 'John Doe',
        age: 28
      }
    }
  }
  // ...
}

Есть ли способ заставить mongodb создать массив вместо объекта в моем примере , но с использованием только точечных обозначений.

Ответы [ 2 ]

1 голос
/ 06 мая 2019

попробуйте это.

{
    $addToSet: {
        "settings.friends": [
            {
                name: 'John Doe',
                age: 28
            }
        ]
    }
}
0 голосов
/ 06 мая 2019

Это работает в версии mongodb v4.0.9. Я проверил ваш вариант использования в моей машине.

db.collection.update(
  {
    "_id": 'your_key'
  },
  {
    "$set": {
      "settings.friends.0.name": "ABCD"
    }
  },
  {
    "upsert": "true"
  }
)

До обновления запись в моей коллекции была

{
    "_id" : 2,
    "col1" : "val01",
    "settings" : {
        "friends" : [
            {
                "name" : "Ramraj",
                "age" : 28
            }
        ]
    }
}

После обновления запись в моей коллекции была

{
    "_id" : 2,
    "col1" : "val01",
    "settings" : {
        "friends" : [
            {
                "name" : "ABCD",
                "age" : 28
            }
        ]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...