首页 > 解决方案 > Pymongo arayfilters 不起作用

问题描述

我在名为locationsfield的 MongoDB 集合中有ip_addresses。该字段如下所示:

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

我想在ip_addresses. 例如,第一个列表中的“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 文档 - 如果arrayFilters在 pymongo 中实现,因为我找不到任何使用它的示例。没有arrayFilters可能在这里得到我想要的东西?

标签: pythonmongodbpymongo

解决方案


在 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 地址时才有效;即,如果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)

推荐阅读