web-dev-qa-db-ja.com

MongoDBは、ドキュメントが存在する場合にTrueを返します

ユーザーIDが既に存在する場合はtrueを返し、そうでない場合はコレクションからfalseを返します。この関数はありますが、常にTrueを返します。

def alreadyExists(newID):
    if db.mycollection.find({'UserIDS': { "$in": newID}}):
        return True
    else:
        return False

ユーザーIDがすでに存在する場合にのみtrueを返すようにこの関数を取得するにはどうすればよいですか?

16
user94628

注:この答えは時代遅れです。 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})することができます

27
Philipp

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_documentsMongo 4に置き換えられました):

if db.collection.count({ 'UserIDS': newID }, limit = 1) != 0:
  # do something
5
Xavier Guihot

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
0
Prateek Jha

これは私のために働いた

result = num.find({"num": num}, { "_id": 0 }) 
if result.count() > 0:  
   return
else:
   num.insert({"num": num, "DateTime": DateTime })
0
siva kumar

Mongodbクエリの1つのライナーソリューション

db.mycollection.find({'UserIDS': { "$in": newID}}).count() > 0 ? true : false
0
Deepak Shingan