python - 如何使用 pymongo 在数组中搜索值

标签 python mongodb pymongo

我正在编写一个网络爬虫程序,现在它已经可以工作了,我想制作一个 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/

相关文章:

python - 根据行间变化的计算创建新列?

python - python(transpose)中如何基于单列展开数据?

python - 在 Python 中表示图灵机的无限磁带的最有效方法是什么?

node.js - 从回调中捕获异常

python - pymongo ImportError 尽管已安装

python - 是否可以将 "find"方法与 "javascript"查询一起用于 pymongo?

python - 处理字符串形式的 MongoDB 字段并将其视为数字

python - 随机 Python 模拟的校准

java - 将初始(批量)数据导入 RESTful 系统的最佳做法是什么?

mongodb - 将元素从 $pull 移动到另一个数组