Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;或;嵌入式文档java中的条件_Java_Mongodb_Aggregation Framework - Fatal编程技术网

&引用;或;嵌入式文档java中的条件

&引用;或;嵌入式文档java中的条件,java,mongodb,aggregation-framework,Java,Mongodb,Aggregation Framework,在MongoDB Java驱动程序的嵌入式文档中创建$或条件的正确语法是什么 实际上是否可以将光标移到嵌入的文档 假设我有以下文档: { statuses: [{ { streamName: A }{ statusA: 0 }{ statusB: 1 } }, { { streamName: B

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

  • 实际上是否可以将光标移到嵌入的文档

  • 假设我有以下文档:

    {
        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)
    
    List obj=new ArrayList();
    DBObject query=new BasicDBObject();
    对象添加(新的基本对象(“状态”),
    新的BasicDBObject(“statusA”,
    新的基本对象(“$gt”,0));
    对象添加(新的基本对象(“状态”),
    新的BasicDBObject(“状态B”,
    新的基本对象(“$gt”,0));
    查询.放置(“$or”,obj)
    db.find(collectionName,查询)
    

    我没有找到任何关于这个的文件

    你所拥有的转化为

    { "$or" : [ { "statuses" : { "statusA" : { "$gt" : 0}}} , { "statuses" : { "statusB" : { "$gt" : 0}}}]}
    
    用于整个文档的比较

    要比较嵌入式数组/文档中的字段,必须使用点表示法

    { "$or" : [ { "statuses.statusA" : { "$gt" : 0}} , { "statuses.statusB" : { "$gt" : 0}}]}
    
    下面是equaliavent 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);
    
    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));
    

    你所拥有的转化为

    { "$or" : [ { "statuses" : { "statusA" : { "$gt" : 0}}} , { "statuses" : { "statusB" : { "$gt" : 0}}}]}
    
    用于整个文档的比较

    要比较嵌入式数组/文档中的字段,必须使用点表示法

    { "$or" : [ { "statuses.statusA" : { "$gt" : 0}} , { "statuses.statusB" : { "$gt" : 0}}]}
    
    下面是equaliavent 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);
    
    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));
    

    你的BasicDBObject包含BasicDBObject???我看到了另一个“and”的例子,它们是这样做的。你的BasicDBObject包含BasicDBObject???我看到了另一个“and”的例子,它们是这样做的。我可以用DBObject代替Document吗?什么是Bson?你能解释一下你为什么用这种方式做语法吗?在count示例中,如果使用dbobjects列表,那么使用parse?Np.Yes您可以。Bson是一个允许从更高级别的类转换到特定实现的接口。检查Bson的所有实现以了解更多信息。它只是一种转义双引号的格式,直接从JavaIDE复制。可以使用单引号内联整个字符串。Col是数据库集合引用。可以,您可以改为创建db对象列表。$$要引用用户变量,请在flilter阶段中定义以访问数组中的单个元素。是的,我可以在一点时间内更新答案。我可以使用DBObject而不是Document吗?什么是Bson?你能解释一下你为什么用这种方式做语法吗?在count示例中,如果使用dbobjects列表,那么使用parse?Np.Yes您可以。Bson是一个允许从更高级别的类转换到特定实现的接口。检查Bson的所有实现以了解更多信息。它只是一种转义双引号的格式,直接从JavaIDE复制。可以使用单引号内联整个字符串。Col是数据库集合引用。可以,您可以改为创建db对象列表。$$要引用用户变量,请在flilter阶段中定义以访问数组中的单个元素。是的,我可以更新一下答案。