ユーザーIDが既に存在する場合はtrueを返し、そうでない場合はコレクションからfalseを返します。この関数はありますが、常にTrue
を返します。
def alreadyExists(newID):
if db.mycollection.find({'UserIDS': { "$in": newID}}):
return True
else:
return False
ユーザーIDがすでに存在する場合にのみtrueを返すようにこの関数を取得するにはどうすればよいですか?
注:この答えは時代遅れです。 MongoDBのより新しいバージョンでは、はるかに効率的なメソッド _
db.collection.countDocuments
_ を使用できます。より良い解決策については、Xavier Guihotによる 答え を参照してください。
find
はブール値を返さず、 cursor を返します。そのカーソルにドキュメントが含まれているかどうかを確認するには、cursors count-methodを使用します。
if db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0
。
ところで、newIDは配列ですか?そうでない場合は、_$in
_- operatorを使用しないでください。単にfind({'UserIDS': newID})
することができます
Mongo 4.0.3
/PyMongo 3.7.0
を開始すると、 count_documents
を使用できます。
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1) != 0:
# do something
オプションのパラメータlimit
と共に使用すると、一致するオカレンスが少なくとも1つあるかどうかを確認できます。
一致するオカレンスの数を制限すると、コレクション全体を検索するのではなく、一致が見つかるとすぐにコレクションのスキャンが停止します。
1
はpython条件でTrue
として解釈されるため、これは次のように記述することもできます。
if db.collection.count_documents({ 'UserIDS': newID }, limit = 1):
# do something
Mongo
/Pymongo
の以前のバージョンでは、count
を使用できました(非推奨で、count_documents
のMongo 4
に置き換えられました):
if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
# do something
Motorを使用している場合、find()はデータベースとの通信を行わず、MotorCursorを作成して返します。
http://motor.readthedocs.org/en/stable/api/motor_collection.html#motor.MotorCollection.find
MotorCursorはNoneではないため、Pythonはそれを「true」値と見なし、関数はTrueを返します。クエリに一致するドキュメントが少なくとも1つ存在するかどうかを知りたい場合は、find_one()を試してください。 :
@gen.coroutine
def alreadyExists(newID):
doc = yield db.mycollection.find_one({'UserIDS': { "$in": newID}})
return bool(doc)
TornadoでI/Oを実行するには、「コルーチン」と「イールド」が必要であることに注意してください。コールバックを使用することもできます:
def alreadyExists(newID, callback):
db.mycollection.find_one({'UserIDS': { "$in": newID}}, callback=callback)
コールバックとコルーチンの詳細については、モーターチュートリアルを参照してください。
http://motor.readthedocs.org/en/stable/tutorial.html
MotorではなくPyMongoを使用している場合は、より簡単です。
def alreadyExists(newID):
return bool(db.mycollection.find_one({'UserIDS': { "$in": newID}}))
最後に、MongoDBの$ in演算子は値のリストを受け取ります。 newIDはリストですか?おそらくあなただけが欲しい:
find_one({'UserIDS': newID})
解決策を投稿するのは非常に遅いと思います。とにかく私は今日同じ問題に遭遇し、次は私のために働いた。これが他の人に役立つことを願っています。
return db.mycollection.find({'UserIDS': newID}).count > 0
これは私のために働いた
result = num.find({"num": num}, { "_id": 0 })
if result.count() > 0:
return
else:
num.insert({"num": num, "DateTime": DateTime })
Mongodbクエリの1つのライナーソリューション
db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0 ? true : false