我正在使用:
mongodb server 3.47
windows 10 64-bit
python 3.62 64-bit
pymongo 3.50
“dict”数据库中的“k”集合中有两条记录:
{"text": "xdcdcdcd", "sent": "false"}
{"text": "vvrvrrrv", "sent": "true"}
我想选择一个“已发送”等于false的随机记录:
from pymongo import MongoClient
client = MongoClient()
db = client.dict
k = db.k
item = list(k.aggregate([{"$sample": {"size": 1}}, {"$match": {"sent": False}}]))
变量项应该是“[{”_id“:”.....“,”text“:”xdcdcdcd“,”sent“:”false“}]”,但我试了几次,有时它工作正常,但有时会返回[]。
答案 0 :(得分:2)
Mongo's aggregate是一个管道操作。这意味着它将逐个应用您的汇总列表。
在您的示例中,它执行两个步骤(列表中有两个元素):
1. {"$sample": {"size": 1}}
2. {"$match": {"sent": False}}
第一步只获得一个数据(size=1
),它可以是{"text": "xdcdcdcd", "sent": "false"}
或{"text": "vvrvrrrv", "sent": "true"}
。
然后在第二步中,您应用"$match"
,有50%您将获得[]
(当您在第一步中获得{"text": "vvrvrrrv", "sent": "true"}
时)。
因此,如果您设置{"size": 1}
,您将始终获得预期的结果。
但实际上{"$sample": {"size": 1}}
没用,只需将其删除即可。