我正在努力为其中一个条件建立查询,我有一个类似这样的文档:

[
 {
    "status": "a"
 },
 {
    "status": "b"
 },
 {
    "status": "foo"
 },
 {
    "status": "a",
    "flightDetails": [
        {
            "test": "xyz"
        }
    ]
 }
]


我的选择标准如下:


获取状态为abc
获取状态为abcflightDetails且大小大于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)
        )
    ));

07-26 05:12