2017-08-24 53 views
0

我使用:MongoDB的隨機抽樣奇怪的行爲

mongodb server 3.47 
windows 10 64-bit 
python 3.62 64-bit 
pymongo 3.50 

有兩種記錄在「字典」數據庫「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 「:」 ......「, 」文本「: 」xdcdcdcd「, 」發送「: 」假「}] 「,但我試過了真正的時代,有時它工作正常,但有時它返回[]。

回答

1

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}}是無用的,只是刪除它。

+0

非常感謝。 – jac123