Python Pymongo arayfilters不工作
我在MongoDB集合中有名为Python Pymongo arayfilters不工作,python,mongodb,pymongo,Python,Mongodb,Pymongo,我在MongoDB集合中有名为位置的字段ip\U地址。此字段如下所示: [['178.150.147.148'], ['198.16.78.43']] db.locations.find_one_and_update({"date": new_date}, {"$push": {"ip_addresses.0": ip}}, upsert=True, multi
位置的字段ip\U地址
。此字段如下所示:
[['178.150.147.148'], ['198.16.78.43']]
db.locations.find_one_and_update({"date": new_date},
{"$push": {"ip_addresses.0": ip}},
upsert=True, multi=False,
return_document=ReturnDocument.AFTER)
我想在ip\u地址
中的特定位置添加一个新的ip\u地址。例如,第一个列表中的“192.162.78.101”(其中“178.150.147.148”为)。
期望输出:
[['178.150.147.148', '192.162.78.101'], ['198.16.78.43']]
我在pymongo中的查询
:
find_index = 0
new_date = "12/29/2019"
ip = "192.162.78.101"
db.locations.find_one_and_update({"date": new_date},
{"$push": {"ip_addresses.$[element]": ip}},
{"multi": False, "arrayFilters": [{"element": {"$eq": find_index}}]},
# Try using each and position but didn't succeed
# "$each": ['ip'],
# "$position": find_index}}},
upsert=True,
return_document=ReturnDocument.AFTER)
但我有一个错误:
pymongo.errors.OperationFailure: No array filter found for identifier 'element' in path 'ip_addresses.$[element]'
尝试在pymongo和mongodb文档中搜索-ifarrayFilters
implement in pymongo,因为我找不到任何使用它的示例。如果没有arrayFilters
,可能会得到我想要的结果?在pymongo中,数组过滤器被指定为函数的参数,而不是在对象中。这可能就是您正在寻找的:
find_index = 0
new_date = "12/29/2019"
ip = "192.162.78.101"
db.locations.find_one_and_update({"date": new_date},
{"$push": {"ip_addresses.$[element]": ip}},
upsert=True, multi=False,
array_filters=[{ "element": { "$eq": find_index }}]
return_document=ReturnDocument.AFTER)
但是,只有当find_index
包含要附加到的数组中的ip地址时,这才有效;i、 如果find_index='178.150.147.148'
,它就会工作。换句话说,上面的语句是:“将‘192.162.78.101’添加到已经包含‘178.150.147.148’的子数组中”
如果要指定的是子数组的索引,只需使用位置点表示法,如下所示:
[['178.150.147.148'], ['198.16.78.43']]
db.locations.find_one_and_update({"date": new_date},
{"$push": {"ip_addresses.0": ip}},
upsert=True, multi=False,
return_document=ReturnDocument.AFTER)
这几乎就是我想要的!但是,find_index
-这是一个数字,它指定我们应该将ip
添加到哪个数组。例如,在我的问题中,我想添加到第一个子列表ip
“192.162.78.101”-这就是为什么find_index=0
。因此,在本例中,我可以使用类似于{“element”:{“$eq”:find_index}
的东西来代替{“element”:{“$position”:find_index}
,或者如何将0
替换为find_index
:{“$push”:{“ip\u addresses.0”:ip}
。类似于“$push”:{“ip地址.查找索引”:ip}
?今天尝试了“$addToSet”:{'ip地址:{'$each':[ip地址],“$position”:查找索引}}
,并且得到:pymongo.errors.operation失败:在$addToSet:{$each:[“178.150.147.148”],$position:0}中的$each之后找到了意外字段
这很奇怪,但是{'$addToSet':{'ip_addresses.$[element]':ip_address},数组_filters=[{“element”:find_index}],upsert=True,multi=False,return\u document=ReturnDocument.AFTER)
不要在ip\u地址中添加项目
阅读响应的第二部分,它解释了如何使用{“$push”:{“ip\u地址.0”:ip}}
根据索引更新子数组。只需将0
替换为find_index
,类似于{“$push”:{f“ip_地址。${find_index}”:ip}
。您试图用$position
执行的操作将不起作用,因为您有嵌套数组,在该语法中$position
将引用子数组中的位置,而不是父数组。