Python 如何将项目推送到数组中,并在MongoDB中获取该项目的索引,在find_one_和_update pymongo中进行投影
我想$push一个项目到一个数组中,并确定它插入的索引。我怎么能和Mongo一起做这个 我需要它是原子的,因为多个推送可以在文档上并行发生Python 如何将项目推送到数组中,并在MongoDB中获取该项目的索引,在find_one_和_update pymongo中进行投影,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我想$push一个项目到一个数组中,并确定它插入的索引。我怎么能和Mongo一起做这个 我需要它是原子的,因为多个推送可以在文档上并行发生 我使用Python/PyMongo作为驱动程序。在MongoDB中对单个文档的更新是无效的,因此,如果一个更新操作正在写入文档,那么下面的更新操作必须等到第一个更新操作完成。因此,您可以返回更新的文档&在代码中获取新推送的值的索引,因为$push通常会推送到数组的末尾 因此,当您使用MongoDB的聚合框架进行读取时,您可以使用带有$project stag
我使用Python/PyMongo作为驱动程序。在MongoDB中对单个文档的更新是无效的,因此,如果一个更新操作正在写入文档,那么下面的更新操作必须等到第一个更新操作完成。因此,您可以返回更新的文档&在代码中获取新推送的值的索引,因为$push通常会推送到数组的末尾 因此,当您使用MongoDB的聚合框架进行读取时,您可以使用带有$project stage的运算符来获取数组中元素的索引。但投影是聚合框架可以接受比.find或.findOneAndUpdate中的投影多得多的运算符。使用更新操作可能无法获取数组中元素的索引,因此使用下面的查询可以从更新的文档返回完整的新数组&使用python尝试获取新数组中元素的索引 样本文件: 查询: 输出:
Ref:MongoDB中对单个文档的更新是不正确的,因此,如果一个更新操作正在写入文档,则以下更新操作必须等待第一个更新操作完成。因此,您可以返回更新的文档&在代码中获取新推送的值的索引,因为$push通常会推送到数组的末尾 因此,当您使用MongoDB的聚合框架进行读取时,您可以使用带有$project stage的运算符来获取数组中元素的索引。但投影是聚合框架可以接受比.find或.findOneAndUpdate中的投影多得多的运算符。使用更新操作可能无法获取数组中元素的索引,因此使用下面的查询可以从更新的文档返回完整的新数组&使用python尝试获取新数组中元素的索引 样本文件: 查询: 输出:
Ref:您可以将数组的大小与数组一起存储在文档中,并在更新后获得该值: 示例输入文档:{'\u 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 ] }
}
}
]
您可以将数组的大小与数组一起存储在文档中,并在更新后获取该值: 示例输入文档:{'\u 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 ] }
}
}
]
看起来不错,但是我怎么知道大小是在更新数组之后还是之前?更新操作是原子的-不管有多少字段、数组。嵌入对象是新创建的、更新的或从现有文档中删除的。看起来不错,但我如何知道大小是在更新数组之后还是之前确定的?更新操作是原子的-不管有多少字段、数组。嵌入对象是新创建、更新或从现有文档中删除的对象。
[
{
'$set': {
'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] }
},
'$set': {
'ix': { '$indexOfArray': [ '$arr', NEW_ITEM ] }
}
}
]