簡體   English   中英

嵌入式文檔Java中的“或”條件

[英]“or” condition in embedded document java

  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}}]}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM