0

我有一个CrossRef 作品记录的数据集存储在 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'})

这将返回名为“Albert”的人的所有文档以及名为“Einstein”的人的所有文档。我可以手动过滤它,但它显然不太理想。

我也试过:

cur = works.find({'author':{'given':'Albert','family':'Einstein','affiliation':[]}})

但这没有返回(经过很长时间的延迟)。我已经尝试过有和没有“从属关系”的情况。关于查询嵌套字段有一些关于 SO 的问题,但似乎没有一个问题涉及我们在 1 个嵌套字段中寻找 2 个特定事物的情况。

4

1 回答 1

0

你的问题是那author是一个列表。

您可以使用聚合查询将此列表展开为对象,然后您的查询将起作用:

cur = works.aggregate([{'$unwind': '$author'},
                       {'$match': {'author.family':'Einstein', 'author.given':'Albert'}}])

或者,$elemMatch在匹配所有指定元素的数组上使用 which 匹配项。

cur = works.find({"author": {'$elemMatch': {'family': 'Einstein', 'given': 'Albert'}}})

还可以考虑使用多键索引

于 2021-01-16T13:39:08.237 回答