2017-08-24 4 views
0

私が使用しています:MongoDBのランダムサンプル奇妙な行動

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

を「辞書」、データベース内の「K」コレクションに2つのレコードがあります

{"text": "xdcdcdcd", "sent": "false"} 
{"text": "vvrvrrrv", "sent": "true"} 

は私が持っているランダムなレコードを選びたいです"送信" 偽に等しい:

from pymongo import MongoClient 
client = MongoClient() 
db = client.dict 
k = db.k 
item = list(k.aggregate([{"$sample": {"size": 1}}, {"$match": {"sent": False}}])) 

可変項目がなければならない "[{" _id ":" ... "、 "テキスト": "xdcdcdcd"、 "送信": "" 偽}] "しかし、私はseを試した数回、ときどきうまくいくことがありますが、時には[]を返します。

答えて

1

Mongo's aggregateはパイプラインアクションです。これは、集計リストを1つずつ適用することを意味します。あなたの例では

は、それは二つのステップ(あなたがあなたのリストの2つの要素を持っている)が行われます。

1. {"$sample": {"size": 1}} 
2. {"$match": {"sent": False}} 

一つだけのデータ(size=1)を取得する最初のステップは、それは{"text": "xdcdcdcd", "sent": "false"}または{"text": "vvrvrrrv", "sent": "true"}のどちらかです。

そして、ステップ2で"$match"を適用すると、[](最初のステップで{"text": "vvrvrrrv", "sent": "true"}を取得したとき)の50%が得られます。

{"size": 1}を設定すると、期待通りの結果が得られます。

実際には{"$sample": {"size": 1}}は役に立たないので、削除してください。

+0

ありがとうございました。 – jac123