Обновите последний элемент массива в MongDB - PullRequest
0 голосов
/ 20 февраля 2019

Вопрос может быть повторен, но не найден правильный ответ, который обрабатывает это условие.Коллекция: coll1

{
  "temperature_status": "Normal",
  "monthly_record": [
    {
      "date": "2019-02-14",
      "average": "75F",
      "daily_record": [
        {
          "avg": "60F",
          "period": "First Half"
        },
        {
          "avg": "90F",
          "period": "Second Half"
        }
      ]
    },
    {
      "date": "2019-02-15",
      "average": "60",
      "daily_record": [
        {
          "avg": "50F",
          "period": "First Half"
        },
        {
          "avg": "70F",
          "period": "Second Half"
        }
      ]
    }
    ]
  }

Я хочу обновить среднее из 2019-02-15 .

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Также, чтобы найти первое совпадение, используйте find_one

0 голосов
/ 20 февраля 2019

Я не совсем понял, чего вы пытаетесь достичь (обновить последний элемент массива или обновить элемент с датой '2019-02-15').

Если вы хотите обновить последний элементмассив в ваших документах

На основе вашего образца (поскольку вы использовали курсор, я адаптировал его для обновления всей базы данных, используйте осторожно. Если вы хотите обновить только 1 документ, вы не должны использовать .find({})

const cursor = coll1.find({}).limit(1);

while (cursor.hasNext()) {
  const item = cursor.next();
  const update_index = doc['monthly_record'].length - 1;
  coll1.update_one({ _id: item._id },
    { '$set': { `monthly_record.${update_index}.average` :'60F' } }
  )
}

Если вы хотите обновить элемент в массиве по определенному индексу

Вы сказали I want to update average of 2019-02-15, это означает, что вы уже знаете фильтр, поэтому вы можете сделать это в одном запросе:

coll1.update({ 'monthly_record.date': '2019-02-15' },
  { '$set': { 'monthly_record.$.average' :'60F' } },
  { multi: true }
)

(Удалить multi: true, если вы хотите обновить только первый соответствующий документ)

...