首页 > 解决方案 > 如何将项目推送到数组并在 MongoDB 中获取该项目的索引,find_one_and_update pymongo 中的投影

问题描述

我想将一个项目 $push 到一个数组中并确定它被插入的索引。我怎么能用 Mongo 做到这一点?

我需要这是原子的,因为多个推送可以在文档上并行发生。

我使用 Python/PyMongo 作为驱动程序。

标签: pythonmongodbmongodb-querypymongo

解决方案


您可以将数组的大小与数组一起存储在文档中,并在更新后获取该值:

示例输入文档:{ '_id: 1', 'arr': [ "apple", "orange" ] }

更新操作 - 使用管道进行更新(适用于 MongoDB 版本 4.2):

NEW_ITEM = 'pear'

r = collection.find_one_and_update(
  { '_id': 1 },
  [
    { 
      '$set': { 
        'ix': { '$size': '$arr' }, 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      } 
    }
  ],
  projection = { '_id': False, 'ix': True }, 
  return_document = ReturnDocument.AFTER
)

另一种方法是在同一更新操作中设置新插入元素的索引(如果数组元素是唯一的,则可以使用此方法):

  [
    { 
      '$set': { 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      },
      '$set': { 
        'ix': { '$indexOfArray': [ '$arr', NEW_ITEM ] } 
      }
    }
  ]

推荐阅读