在 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.