我正在努力为其中一个条件建立查询,我有一个类似这样的文档:
[
{
"status": "a"
},
{
"status": "b"
},
{
"status": "foo"
},
{
"status": "a",
"flightDetails": [
{
"test": "xyz"
}
]
}
]
我的选择标准如下:
获取状态为
a
,b
或c
或获取状态为
a
,b
或c
和flightDetails
且大小大于0的所有数据并非所有文档都包含
flightDetails
键。我试过这样的Java代码:
BasicDBObject inQuery = new BasicDBObject();
inQuery.append("status", new BasicDBObject("$nin", Arrays.asList("a", "b", "c")));
BasicDBObject inQuery2 = new BasicDBObject();
inQuery2.append("$where", "return Object.keys( this.flightDetails").length > 0");
BasicDBList criteria = new BasicDBList();
criteria.add(inQuery);
criteria.add(inQuery2);
BasicDBObject finalQuery = new BasicDBObject("$or",criteria);
但是它返回所有数据,似乎我的查询不正确。我进行了很多搜索,并根据一些答案,尝试建立查询。有人可以帮我吗?由于我是NoSQL和MongoDB的初学者,因此从这几天开始。
最佳答案
对数组的“ 0”元素使用点符号以及$exists
意味着它具有一些内容,并且当然存在:
BasicDBObject query = BasicDBObject("status",
new BasicDBObject("$in", Arrays.asList("a", "b", "c"))
)
.append("flightDetails.0",
new BasicDBObject("$exists",true)
);
这是:
{
"status": { "$in": [ "a","b","c" ] },
"flightDetails.0": { "$exists": true }
}
对于那些习惯于JSON表示法的人。
要合并“根本没有数组”,只需构造
$or
条件:{
"status": { "$in": [ "a","b","c" ] },
"$or": [
{ "flightDetails.0": { "$exists": true } },
{ "flightDetails": { "$exists": false } }
]
}
或对于Java:
BasicDBObject query = BasicDBObject("status",
new BasicDBObject("$in", Arrays.asList("a", "b", "c"))
)
.append("$or",Arrays.<Object>asList(
new BasicDBObject("flightDetails.0",
new BasicDBObject("$exists",true)
),
new BasicDBObject("flightDetails",
new BasicDBObject("$exists",false)
)
));