python - Pymongo arayfilters 不起作用
问题描述
我在名为locations
field的 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
可能在这里得到我想要的东西?
解决方案
在 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)
推荐阅读
- laravel - 使用 whereHas 和关系列的总和进行查询
- metadata - 外部脚本文件 (SAP CAI) 加载错误
- android - 使用 Hilt 注入类以查看组件
- firefox - 如何将 127.0.0.1 设置为 Firefox 的代理
- javascript - HTML 在另一个脚本完成执行后加载一个脚本
- ruby-on-rails - Active Storage 中的补丁 Blob 模型
- ansible - 如何在 Ansible 中为 `group_vars` 替换 DEFAULT_HASH_BEHAVIOR?
- report - 如何创建 zkteco 自定义报告
- docker - Azure App Service 无法使用自定义容器启动(尝试配置 SSH 连接)
- javascript - 为什么我无法从任何网络连接到 NodeJS express 服务器?