如何索引 PyMongo 中已知字段的未知字段?

Posted

技术标签:

【中文标题】如何索引 PyMongo 中已知字段的未知字段?【英文标题】:How to index unknown fields of a known field in PyMongo? 【发布时间】:2019-05-22 09:13:48 【问题描述】:

我正在尝试在数百万条推文中找到唯一的单词,并且我想保留每个单词出现的位置。除此之外,我还按它们的首字母对单词进行分组。这是一个示例代码:

from pymongo import UpdateOne
# connect to db stuff
for word in words: # this is actually not the real loop I've used but it fits for this example
    # assume tweet_id's and position is calculated here
    initial = word[0]
    ret = "tweet_id": tweet_id, "pos": (beg, end) # additional information about word
    command = UpdateOne("initial": initial, "$inc": "count": 1, "$push": "words.%s" % word: ret, upsert=True)
    commands.append(command)
    if len(commands) % 1000 == 0:
        db.tweet_words.bulk_write(commands, ordered=False)
        commands = []

但是,分析所有这些推文的速度很慢。我猜我的问题是因为我没有在 words 字段上使用索引。

这是一个文档的示例输出:


    initial: "t"
    count: 3,
    words: 
        "the": ["tweet_id": <some-tweet-id>, "pos": (2, 5), 
                "tweet_id": <some-other-tweet-id>, "pos": (9, 12)]
        "turkish": ["tweet_id": <some-tweet-id>, "pos": (5, 11)]
    

我尝试使用以下代码创建索引(不成功):

db.tweet_words.create_index([("words.$**", pymongo.TEXT)])

db.tweet_words.create_index([("words", pymongo.HASHED)])

我遇到了 add index fails, too many indexes for twitter.tweet_wordskey too large to index 之类的错误。有没有办法用索引做到这一点?还是应该改变我的方法来解决问题(也许重新设计数据库)?

【问题讨论】:

【参考方案1】:

要被索引,您需要将动态数据保存在对象的值中,而不是键中。所以我建议你修改你的架构,使其看起来像:


    initial: "t"
    count: 3,
    words: [
        value: "the", tweets: ["tweet_id": <some-tweet-id>, "pos": (2, 5), 
                                "tweet_id": <some-other-tweet-id>, "pos": (9, 12)],
        value: "turkish", tweets: ["tweet_id": <some-tweet-id>, "pos": (5, 11)]
    ]

然后您可以将其索引为:

db.tweet_words.create_index([("words.value", pymongo.TEXT)])

【讨论】:

感谢您的回答。但是,我对此还有一个问题。在不久的将来,我想得到一个以字母t 开头的单词列表。如何在没有任何开销的情况下完成此查询?目前,我可以用这个来查询这些词:cur = db.tweet_words.find("initial": initial)words = list(next(cur)["words"]) 代码有点乱,但希望你能明白主要意思。 @TalhaÇolakoğlu 最好将其作为一个新问题发布。 不确定这是否也需要一个新帖子,但这里是:要完成您提到的架构,我应该如何更改当前的更新命令? @TalhaÇolakoğlu 是的,任何重要的后续问题都应该是一个新帖子。

以上是关于如何索引 PyMongo 中已知字段的未知字段?的主要内容,如果未能解决你的问题,请参考以下文章

1054,字段列表中的未知列“索引”

使用已知和未知字段反序列化 json

如何使用 pymongo 创建索引 [重复]

pymongo创建索引更新删除

PyMongo $regex 跨所有文本字段和子字段

Pymongo:如何检查字段是不是存在