如何从MongoDB实时查询数据?

时间:2018-11-14 19:21:45

标签: python mongodb

我创建了一个MongoDB数据库,并且正在向其中发送数据。同时,我正在运行一个Python脚本来从该数据库中获取数据。我希望我的脚本在将新条目推送到数据库后立即将其打印到控制台,但是我不知道该如何完成。

这是我目前的工作,但我不喜欢它,因为每次它都会在db上打印整个数据,即使我只希望在更新后立即输入最后一个条目/条目即可。

from pymongo import MongoClient
import time
import random
from pprint import pprint

client = MongoClient(port=27017)

arr = []

db = client.one

mycol = client["coll"]



while True:
    cursor = db.mycol.find()
    for document in cursor:
        print(document['num'])
    time.sleep(2)    

我该如何解决?

2 个答案:

答案 0 :(得分:5)

从3.6版开始,Mongo DB支持功能调用“更改流”。在documentation中,您将找到以下简单的Python示例:

cursor = db.inventory.watch()
document = next(cursor)

如果光标支持next(),那么您还应该可以在循环,生成器甚至asyncio中使用它。

答案 1 :(得分:3)

有几种方法可以解决此问题,但最简单的方法可能是存储自动递增的“ primaryKey”(或插入时间戳或其他内容),并仅打印该键之后的结果。这是一个简单的示例来演示:

# we start at one...
highest_previous_primary_key = 1

while True:
    cursor = db.mycol.find()
    for document in cursor:

        # get the current primary key, and if it's greater than the previous one
        # we print the results and increment the variable to that value
        current_primary_key = document['primaryKey']
        if current_primary_key > highest_previous_primary_key:
            print(document['num'])
            highest_previous_primary_key = current_primary_key

    time.sleep(2)

这也许是最懒的做法。但除此之外,您可以尝试执行以下操作:

  1. 调整查询本身,使其仅获取项目> primaryKey(假设您有十亿个结果,并且每次获取所有结果)。