java - "or"嵌入文档java中的条件

标签 java mongodb aggregation-framework

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

  2. 是否真的可以将光标定位到嵌入文档?

假设我有以下文档:

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

我没有找到任何相关文档。

最佳答案

你所拥有的转化为

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

用于整个文档比较。

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

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

等效的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));

关于java - "or"嵌入文档java中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48404305/

相关文章:

node.js - 我想计算nodejs mongodb列中的三个字段,并且需要按月对其进行分组

node.js - mongodb 聚合中的 if else if cond

javascript - 聚合嵌套数组中的数据

node.js - Mongoose DBRef 删除原始模式删除以删除 DBRef 并从 DBRef 数组中拉出

node.js - Mongojs 回调未返回

c# - 将所有小数的默认 MongoDb/Bson 表示设置为 double

java - 连接后在 SQL 中打印新行

java - JTable:如何用TableCellRenderer实现自定义翻转效果

java - 有没有办法从 Java 中的数组中删除对象?

java - 如果任何其他线程未调用 await(),Thread 的某些子类是否可以调用 Condition 的函数 signal()?