MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分
Posted
技术标签:
【中文标题】MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分【英文标题】:MongDB find document by top-level property and nested array key, and return part of the matched document 【发布时间】:2021-09-24 10:31:24 【问题描述】:我是 MongoDB 的新手。我在 MongoDB 集合中有以下 JSON 文档。
name: "Alice",
orders:
1:
items: [11,22,33,…],
delivery: [
from: area1
to: area2
,
from: area2
to: area3
,
⋮
],
areas:
area1:
address: "area1 address"
contacts: [1,2,3,…]
,
area2:
address: "area2 address"
contacts: [4,2,8,…]
,
⋮
2: … ,
3: … ,
4: … ,
5: …
⋮
⋮
我想通过orders
中的key搜索具有特定name
和特定顺序的文档,并返回包含匹配顺序的匹配文档的子部分。
例如,对于名称 Alice 和订单 1,我想检索:
name: "Alice",
orders:
1:
items: [11,22,33,…],
delivery: [
from: area1
to: area2
,
from: area2
to: area3
,
⋮
],
areas:
area1:
address: "area1 address"
contacts: [1,2,3,…]
,
area2:
address: "area2 address"
contacts: [4,2,8,…]
,
⋮
我正在使用 PyMongo,我该如何实现?
【问题讨论】:
到目前为止你尝试了什么? 我可以通过这种方式检索完整记录:db.find_one('name': 'Alice')
,但无法通过 Key 获取订单,不知道如何排除与 Key 不匹配的其他记录。
【参考方案1】:
我对 PyMongo 不是很熟悉,但是 AFAIK 你可以通过将第二个参数作为projection
传递给find_one
来过滤你的结果,“应该在结果集中返回的字段名称列表或dict 指定要包含或排除的字段”see the docs on find
, which also apply to find_one
。在投影中,您可以通过将 0
或 1
作为值传递来“打开/关闭”各个字段以返回,所以我会尝试这样的事情:
db.find_one('name': 'Alice',
'orders': 1: 1
)
【讨论】:
谢谢@fsimonjetz。这可行,但是,它只返回order
JSON,它是一个子文档,而不是主文档属性。例如,它不会以 JSON 格式返回 name
。我想用搜索到的order
获取主文档。你的建议输出是"orders":"2":…
,我想要的是"name":"Alice","orders":'2':…
,如果能得到"name":"Alice","orders":…
就更好了
它只返回order
JSON,因为这是在第二个参数中定义的。如果您也需要名称,请将函数调用中的 'orders':1: 1
更改为 'name':1, 'orders': 1: 1
- 但如果您需要整个条目,db.find_one('name': 'Alice')
应该可以,不是吗?
或者是在检索条目后从条目中提取数据的问题?由于条目是 JSON,我假设您可以通过索引获取子元素,例如,match = db.find_one('name': 'Alice'); print(match['orders'][1])
——这行得通吗?
是的,做到了。谢谢。以上是关于MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分的主要内容,如果未能解决你的问题,请参考以下文章
通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档
当嵌套字典键发生变化时,如何使用嵌套字典查询 mongodb 文档?
根据对象数组中不匹配的属性查找匹配的文档 - MongoDB