我正在编写一个网络爬虫程序,现在它已经可以工作了,我想制作一个 get_inverted_index 函数。 因此,我有两个收藏:词典和文档。在文档词典的每个文档中,我都有一个名为words的数组,其中包含每个文档(页面)中每个单词的id和字体大小。我的下一步将是迭代这些单词并查找具有每个特定单词的文档,但我不知道如何编写此请求的查询。我尝试过以下代码片段:
k = {}
for word in self.lexicon.find():
s = set()
for page in self.documents.find({'words' : {'$in' : word['_id'}}):
但是这个查询没有正常工作。 举个例子,我的词典收藏中的一个条目:
{
"_id": {
"$oid": "54723c55b59c44a167ed3424"
},
"word": "google"
}
以及我的文档集合中的一个示例:
{
"_id": {
"$oid": "54723c54b59c44a167ed3423"
},
"url": "http://www.google.com",
"words": [
[
{
"$oid": "54723c55b59c44a167ed3424"
},
7
],
[
{
"$oid": "54723c55b59c44a167ed3425"
},
2
],
[
{
"$oid": "54723c55b59c44a167ed3428"
},
0
],
[
{
"$oid": "54723c55b59c44a167ed342b"
},
0
],
[
{
"$oid": "54723c56b59c44a167ed342e"
},
0
],
[
{
"$oid": "54723c5eb59c44a167ed3477"
},
0
]
]
}
@编辑
我也尝试过使用正则表达式,但没有成功:(用于测试表达式)
for page in documents.find({'words' : [ObjectId('547244abb59c44a167ed4a84'), {"$regex": "*"}]}):
print page
还有
for page in documents.find({'words' : [{'$in' : ObjectId('547244abb59c44a167ed4a84')}, {'$regex': '*'}]}):
print page
最佳答案
对于文档集合来说,这是一个非常不幸的架构选择。
你说你有一个名为 words
的数组其中包含每个文档中每个单词的 id 和字体大小。不幸的是,你有这个 id 和字体大小作为另一个数组。有意义的是将 id 和字体大小作为子文档中的命名字段。用更Pythonic的术语来说,你需要一个字典列表,而不是列表列表。
{ "_id": <id here>,
"url": "http://www.google.com",
"words": [
{ "id":<id>, "fs":7 },
{ "id":<id>, "fs":2 }
]
}
这将使通过 documents.find({"words.id":<id>})
进行查询变得简单询问。此外,如果您碰巧想跟踪每个单词的其他信息,那么第二个数字的含义就不那么神秘了。
虽然您可以设法进行一个查询,该查询恰好返回您所拥有的模式所需的内容,但它实际上不太适合它所描述的内容。但是,如果您决心保留当前结构,则查询它的正确方法是
documents.find({'words':{'$elemMatch':{'0':word['_id']}}})
此语法不是使用 double $elemMatch,而是专门查找其第一个元素与相关 _id 匹配的数组元素。
关于python - 如何使用 pymongo 在数组中搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094310/