在 pymongo 中查找包含嵌套名称数组的文档(CrossRef 数据)
Finding document containing array of nested names in pymongo (CrossRef data)
我有一个 CrossRef works records 的数据集存储在 MongoDB 中名为 works
的集合中,我正在使用 Python 应用程序来查询该数据库。
我正在尝试根据一位作者的姓名查找文档。删除无关的细节,文档可能如下所示:
{'DOI':'some-doi',
'author':[{'given': 'Albert','family':'Einstein',affiliation:[]},
{'given':'R.','family':'Feynman',affiliation:[]},
{'given':'Paul','family':'Dirac',affiliation:['University of Florida']}]
}
我不清楚如何组合查询以仅获取阿尔伯特·爱因斯坦的论文。
我在 author.family 和 author.given 上有索引,我试过:
cur = works.find({'author.family':'Einstein','author.given':'Albert'})
此 returns 由名为 'Albert' 的人编写的所有文档以及由名为 'Einstein' 的人编写的所有文档。我可以手动过滤这个,但它显然不太理想。
我也试过:
cur = works.find({'author':{'given':'Albert','family':'Einstein','affiliation':[]}})
但这returns什么都没有(经过很长时间的延迟)。我已经尝试过使用 'affiliation' 和不使用 'affiliation'。 SO 上有几个关于查询嵌套字段的问题,但 none 似乎与我们在 1 个嵌套字段中查找 2 个特定内容的情况有关。
你的问题是 author
是一个列表。
您可以使用聚合查询将此列表展开为对象,然后您的查询将起作用:
cur = works.aggregate([{'$unwind': '$author'},
{'$match': {'author.family':'Einstein', 'author.given':'Albert'}}])
或者,使用 $elemMatch
匹配匹配所有指定元素的数组。
cur = works.find({"author": {'$elemMatch': {'family': 'Einstein', 'given': 'Albert'}}})
也可以考虑使用 multikey indexes.
我有一个 CrossRef works records 的数据集存储在 MongoDB 中名为 works
的集合中,我正在使用 Python 应用程序来查询该数据库。
我正在尝试根据一位作者的姓名查找文档。删除无关的细节,文档可能如下所示:
{'DOI':'some-doi',
'author':[{'given': 'Albert','family':'Einstein',affiliation:[]},
{'given':'R.','family':'Feynman',affiliation:[]},
{'given':'Paul','family':'Dirac',affiliation:['University of Florida']}]
}
我不清楚如何组合查询以仅获取阿尔伯特·爱因斯坦的论文。
我在 author.family 和 author.given 上有索引,我试过:
cur = works.find({'author.family':'Einstein','author.given':'Albert'})
此 returns 由名为 'Albert' 的人编写的所有文档以及由名为 'Einstein' 的人编写的所有文档。我可以手动过滤这个,但它显然不太理想。
我也试过:
cur = works.find({'author':{'given':'Albert','family':'Einstein','affiliation':[]}})
但这returns什么都没有(经过很长时间的延迟)。我已经尝试过使用 'affiliation' 和不使用 'affiliation'。 SO 上有几个关于查询嵌套字段的问题,但 none 似乎与我们在 1 个嵌套字段中查找 2 个特定内容的情况有关。
你的问题是 author
是一个列表。
您可以使用聚合查询将此列表展开为对象,然后您的查询将起作用:
cur = works.aggregate([{'$unwind': '$author'},
{'$match': {'author.family':'Einstein', 'author.given':'Albert'}}])
或者,使用 $elemMatch
匹配匹配所有指定元素的数组。
cur = works.find({"author": {'$elemMatch': {'family': 'Einstein', 'given': 'Albert'}}})
也可以考虑使用 multikey indexes.