更新MongDB中数组的最后一个元素

时间:2019-02-20 04:06:31

标签: mongodb pymongo

该问题可能会重复,但找​​不到适合此情况的正确答案。该集合是: 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 :(得分:1)

我不清楚您要实现什么(更新数组的最后一项或更新日期为'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

答案 1 :(得分:-1)

此外,要找到第一个匹配项,请使用find_one