如何在 MongoDB 和 Java 中同时使用 AND 和 OR 子句执行查询?
How to execute queries with both AND and OR clauses in MongoDB with Java?
我想在 MongoDB 3.2 中使用 Java Driver 3.2 执行查询,其中同时包含 $and
和 $or
子句。
使用 reference,我尝试了以下方法:
List<Document> criteria1 = new ArrayList<>();
List<Document> criteria2 = new ArrayList<>();
criteria1.add(new Document("fetchStatus", new Document("$gte", FetchStatus.PROCESSED_NLP.getID())));
criteria1.add(new Document("fetchStatus", new Document("$lte", fetchStatusParam)));
criteria1.add(new Document("episodeID", new Document("$in", episodeIDs)));
criteria2.add(new Document("fetchStatus", new Document("$eq", PROCESSED_FETCH.getID())));
criteria2.add(new Document("isFullTextRet", new Document("$eq", false)));
BasicDBList or = new BasicDBList();
or.add(criteria1);
or.add(criteria2);
DBObject query = new BasicDBObject("$or", or);
ArrayList<Document> results = dbC_Coll.find(query).into(new ArrayList<>());
criteria1
和 criteria2
应与 $or
连接,而在 criteria1
子句中应应用 $and
。
问题是在 MongoDB Java 驱动程序 3.2 中没有这样的方法,我得到 Cannot resolve method find(com.mongodb.DBObject)
错误。
我的问题:
如何在 MongoDB Java Driver 3.2 中编写查询,例如 (A && B) || (X && Y)
?
就我个人而言,我发现像 U 那样构造对象序列并使用 JSON 结构来增强可读性要容易得多。但它仍然只是 Document()
无论你在哪里看到 {}
和 List
无论你在哪里看到 []
:
Document query = new Document(
"$or", Arrays.asList(
// First document in $or
new Document(
"fetchStatus",
new Document( "$gte", FetchStatus.PROCESSED_NLP.getID() )
.append("$lte", fetchStatusParam)
)
.append("episodeID", new Document( "$in", episodeIDs)),
// Second document in $or
new Document("fetchStatus", PROCESSED_FETCH.getID())
.append("isFullTextRet", false)
)
);
基本相同:
{
"$or": [
{
"fetchStatus": {
"$gte": FetchStatus.PROCESS_NLP.getID(),
"$lte": fetchStatusParam
},
"episodeID": { "$in": episodeIDs }
},
{
"fetchStatus": PROCESSED_FETCH.getID(),
"isFullTextRet": false
}
]
}
也不需要 "explicit" $eq
运算符,因为 "equals" 实际上是查询 属性 中赋值的默认含义。
我想在 MongoDB 3.2 中使用 Java Driver 3.2 执行查询,其中同时包含 $and
和 $or
子句。
使用 reference,我尝试了以下方法:
List<Document> criteria1 = new ArrayList<>();
List<Document> criteria2 = new ArrayList<>();
criteria1.add(new Document("fetchStatus", new Document("$gte", FetchStatus.PROCESSED_NLP.getID())));
criteria1.add(new Document("fetchStatus", new Document("$lte", fetchStatusParam)));
criteria1.add(new Document("episodeID", new Document("$in", episodeIDs)));
criteria2.add(new Document("fetchStatus", new Document("$eq", PROCESSED_FETCH.getID())));
criteria2.add(new Document("isFullTextRet", new Document("$eq", false)));
BasicDBList or = new BasicDBList();
or.add(criteria1);
or.add(criteria2);
DBObject query = new BasicDBObject("$or", or);
ArrayList<Document> results = dbC_Coll.find(query).into(new ArrayList<>());
criteria1
和 criteria2
应与 $or
连接,而在 criteria1
子句中应应用 $and
。
问题是在 MongoDB Java 驱动程序 3.2 中没有这样的方法,我得到 Cannot resolve method find(com.mongodb.DBObject)
错误。
我的问题:
如何在 MongoDB Java Driver 3.2 中编写查询,例如 (A && B) || (X && Y)
?
就我个人而言,我发现像 U 那样构造对象序列并使用 JSON 结构来增强可读性要容易得多。但它仍然只是 Document()
无论你在哪里看到 {}
和 List
无论你在哪里看到 []
:
Document query = new Document(
"$or", Arrays.asList(
// First document in $or
new Document(
"fetchStatus",
new Document( "$gte", FetchStatus.PROCESSED_NLP.getID() )
.append("$lte", fetchStatusParam)
)
.append("episodeID", new Document( "$in", episodeIDs)),
// Second document in $or
new Document("fetchStatus", PROCESSED_FETCH.getID())
.append("isFullTextRet", false)
)
);
基本相同:
{
"$or": [
{
"fetchStatus": {
"$gte": FetchStatus.PROCESS_NLP.getID(),
"$lte": fetchStatusParam
},
"episodeID": { "$in": episodeIDs }
},
{
"fetchStatus": PROCESSED_FETCH.getID(),
"isFullTextRet": false
}
]
}
也不需要 "explicit" $eq
运算符,因为 "equals" 实际上是查询 属性 中赋值的默认含义。