有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找状态为a、b或c且数组大于0的MongoDB记录

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

[
 {
    "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的初学者,几天前开始学习


共 (1) 个答案

  1. # 1 楼答案

    对数组的“0”元素和^{}使用点表示法意味着它有一些内容,当然也存在:

    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)
            )
        ));