&引用;或;嵌入式文档java中的条件
在MongoDB Java驱动程序的嵌入式文档中创建&引用;或;嵌入式文档java中的条件,java,mongodb,aggregation-framework,Java,Mongodb,Aggregation Framework,在MongoDB Java驱动程序的嵌入式文档中创建$或条件的正确语法是什么 实际上是否可以将光标移到嵌入的文档 假设我有以下文档: { statuses: [{ { streamName: A }{ statusA: 0 }{ statusB: 1 } }, { { streamName: B
$或条件的正确语法是什么
实际上是否可以将光标移到嵌入的文档
假设我有以下文档:
{
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阶段中定义以访问数组中的单个元素。是的,我可以更新一下答案。