web-dev-qa-db-ja.com

Javaドライバーを使用してMongoDBの$ orクエリを作成するにはどうすればよいですか?

MongoDBでいくつかの条件を試しています(Javaドライバを使用)。これは私がやっていることです:

Pattern regex = Pattern.compile("title");   
DBCollection coll = MongoDBUtil.getDB().getCollection("post_details");

BasicDBObject query = new BasicDBObject();
query.put("category_title", "myCategory");      
query.append("post_title", regex);  
query.append("post_description", regex);    

DBCursor cur = coll.find(query);
while(cur.hasNext()) {
    System.out.println(cur.next().get("post_id"));
}

これらの条件で$orオペランドを使用したいのですが、デフォルトは「and」で、変更方法がわかりません。上記のコードでは、条件の1つがnullを返す場合、結果もnullになります。

35
MoienGK

クエリで複数のフィールドを指定するための「デフォルト」は、各フィールドが条件フィルターとして機能するため、AND演算であることは正しいです。

次の構文を持つ$ orオペランドを使用して、OR句でMongoDBクエリを実行できます。

db.col.find({$or:[clause1, clause2]})

各句はクエリにすることができます。 $ orは最上位のオペランドである必要はありませんが、MongoDBの場合は、各句にインデックスを使用できます。

あなたの例では、このクエリで終わる必要があります:

db.col.find({$or:[{"post_title", regex}, {"post_description", regex}]});  

Java throughで構築できます:

DBObject clause1 = new BasicDBObject("post_title", regex);  
DBObject clause2 = new BasicDBObject("post_description", regex);    
BasicDBList or = new BasicDBList();
or.add(clause1);
or.add(clause2);
DBObject query = new BasicDBObject("$or", or);
71
Remon van Vliet

filters を使用すると、次のようにビルドできます。

import com.mongodb.client.model.Filters;
...

Bson filter = Filters.or(
                    Filters.eq("post_title", regex), 
                    Filters.eq("post_description", regex)
                  );
9
hestellez