Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pymongo arayfilters不工作_Python_Mongodb_Pymongo - Fatal编程技术网

Python Pymongo arayfilters不工作

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

我在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=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文档中搜索-if
arrayFilters
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
将引用子数组中的位置,而不是父数组。