"或"嵌入式文档java中的条件

时间:2018-01-23 14:39:08

标签: java mongodb aggregation-framework

  1. 在MongoDB Java驱动程序中的嵌入式文档中创建$or条件的正确语法是什么?

  2. 实际上是否可以将光标放到嵌入文档中?

  3. 假设我有以下文件:

    {
        statuses: [{
            {
                streamName: A
            }{
                statusA: 0
            }{
                statusB: 1
            }
        },
        {
            {
                streamName: B
            }{
                statusA: 0
            }{
                statusB: 1
            }
        }]
    }
    

    我还希望将光标放到至少有一个大于0的状态的子文档(状态数组中)。

    我就是这样做的,但它没有工作:

    List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
    DBObject query = new BasicDBObject();
    
    obj.add(new BasicDBObject ("statuses", 
            new BasicDBObject ("statusA",
            new BasicDBObject ("$gt",0 ) )));
    
    obj.add(new BasicDBObject ("statuses",
            new BasicDBObject ("statusB" ,
            new BasicDBObject ("$gt",0 ) )));
    
    query.put("$or",obj)
    db.find(collectionName,query)
    

    我没有找到任何关于此的文件。

1 个答案:

答案 0 :(得分:2)

您所翻译的内容

{ "$or" : [ { "statuses" : { "statusA" : { "$gt" : 0}}} , { "statuses" : { "statusB" : { "$gt" : 0}}}]}

用于整个文档比较。

为了比较嵌入式数组/ doc中的字段,您必须使用点表示法。

{ "$or" : [ { "statuses.statusA" : { "$gt" : 0}} , { "statuses.statusB" : { "$gt" : 0}}]}

equliavent java代码位于

之下
List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
DBObject query = new BasicDBObject();
obj.add(new BasicDBObject ("statuses.statusA", new BasicDBObject ("$gt",0 ) ));
obj.add(new BasicDBObject ("statuses.statusB" , new BasicDBObject ("$gt",0 ) ));
query.put("$or",obj);

或者,您可以使用$elemMatch在嵌入式阵列上运行匹配。与您的情况类似,但$ elemMatch将条件应用于每个字段。

这样的东西
{ "statuses" : { "$elemMatch" : { "$or" : [ { "statusA" : { "$gt" : 0}} , { "statusB" : { "$gt" : 0}}]}}}

Java代码

BasicDBList obj = new BasicDBList();
obj.add(new BasicDBObject ("statusA",new BasicDBObject ("$gt",0 ) ));
obj.add(new BasicDBObject ("statusB",new BasicDBObject ("$gt",0 ) ));
DBObject query = new BasicDBObject("statuses", new BasicDBObject("$elemMatch", new BasicDBObject("$or",obj)));

计算匹配事件的数量。

Bson count = new Document("statuses", Document.parse("{$size:{\n" +
            "            $filter: {\n" +
            "               input: \"$statuses\",\n" +
            "               as: \"status\",\n" +
            "               cond: { \"$or\" : [ {$gt:[\"$$status.statusA\", 0]} , {$gt:[\"$$status.statusB\", 0]}]}\n" +
            "            }\n" +
            "         }}"));
Bson project = new Document("$project", count);
col.aggregate(Arrays.asList(project));