簡體   English   中英

使用Java驅動程序運行聚合-MongoDB

[英]Run an aggregation using Java Driver - MongoDB

使用MongoDB shell,我使用:

db.bios.aggregate(
[
{$match:{"contribs.0.name":{"$exists":1}}}, 
{$project: {contribs:{$arrayElemAt:["$contribs",0]}}}
]
)

如何使用Java驅動程序( 2.14.1 )進行相同的查詢? 我嘗試:

首先,我為$match階段創建一個DBObject:

DBObject match = new BasicDBObject("$match",new BasicDBObject("contribs.0.name",
                 new BasicDBObject("$exists",1)));

然后我創建一個BasicDBList

BasicDBObject obj = new BasicDBObject("$contribs",0);

BasicDBList arrayElemAt = new BasicDBList();
arrayElemAt.add(obj);

這是$project階段:

DBObject project1 = new BasicDBObject("$project", new BasicDBObject("contribs",
                    new BasicDBObject("$arrayElemAt",arrayElemAt)));

最后,我創建了聚合管道:

List<DBObject> list = new ArrayList<>();
list.add(match);
list.add(project1);

AggregationOutput output = this.coll.aggregate(list);

$Match階段有效,但$project無效。

我收到一個錯誤: "errmsg" : "invalid operator '$contribs'" , "code" : 15999

您本打算創建List時創建了一個DBObject 此外, DBList已經過時了一段時間。 習慣使用標准列表符號:

    List<DBObject> pipeline = Arrays.<DBObject>asList(
        new BasicDBObject(
            "$match",
            new BasicDBObject(
                "contribs.0", new BasicDBObject("$exists",true)
            )
        ),
        new BasicDBObject(
            "$project",
            new BasicDBObject(
                "contribs", new BasicDBObject("$arrayElemAt", Arrays.asList("$contribs",0))
            )
        )
    );

    AggregationOutput output = this.coll.aggrgate(pipeline);

還要注意,在現代驅動程序中,您實際上應該使用Document代替所有DBObject類型。

暫無
暫無

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

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