mongodb随机抽样奇怪的行为

时间:2017-08-24 11:36:18

标签: python mongodb random

我正在使用:

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“}]”,但我试了几次,有时它工作正常,但有时会返回[]。

1 个答案:

答案 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}}没用,只需将其删除即可。