Pymango arayfilters不工作

2024-09-30 18:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在MongoDB集合中有一个名为locations的字段ip_addresses。此字段如下所示:

[['178.150.147.148'], ['198.16.78.43']]

我想在ip_addresses中的特定位置添加一个新的ip地址。例如,第一个列表中的“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在pymongo中实现,因为我找不到任何使用它的示例。如果没有arrayFilters也许有机会得到我想要的


Tags: andipnewdateindexmongodbaddresses地址
1条回答
网友
1楼 · 发布于 2024-09-30 18:34:04

在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、 e,如果find_index='178.150.147.148',它就会工作。换句话说,上面的语句是:“将‘192.162.78.101’添加到已经包含‘178.150.147.148’的子数组中。”

如果要指定的是子数组的索引,只需使用位置点表示法,如下所示:

db.locations.find_one_and_update({"date": new_date},
                                 {"$push": {"ip_addresses.0": ip}},
                                  upsert=True, multi=False,
                                  return_document=ReturnDocument.AFTER)

相关问题 更多 >