【问题标题】:Project using array fields in MongoDB Java Driver在 MongoDB Java 驱动程序中使用数组字段的项目
【发布时间】:2017-03-17 10:01:46
【问题描述】:

我有如下收藏。我已通过 user 查询此集合。

 {
      "user": "username",
      "sites": {
        "site": "abc",
        "keywords": [
          {
            "keyword": "keyword1",
            "dailyranks": [
              {
                "fild1": "value1"
              },
              {
                "fild2": "value2"
              },
              {
                "fild3": "value3"
              },
            ]
          },
          {
            "keyword": "keyword2",
            "dailyranks": [
              {
                "fild1": "value1"
              },
              {
                "fild2": "value2"
              },
              {
                "fild3": "value3"
              },  
            ]
          },
        ],
      }
    }

我想从集合中获取结果如下,我想获取集合中关键字数组的最后一个元素

[
    {
        "keyword" : "keyword1"
        "fild2" : "value2",
        "fild3" : "value3"
    },
    {
       "keyword" : "keyword2"
        "fild2" : "value2",
        "fild3" : "value3"
    },
]

我使用 $project 进行了汇总,但没有成功。帮我解决这个问题。

使用的代码-

BasicDBObject siteObject = new BasicDBObject();
siteObject.append("keywords", "$sites.keywords.keyword");
siteObject.append("lastrank", "$sites.keywords.dailyranks");

BasicDBList aDBList = new BasicDBList();
aaa.add(new BasicDBObject("user", modelLogin.getUSER_NAME()));

ArrayList<BasicDBObject> doc = new ArrayList<>();
doc.add(new BasicDBObject().append("$unwind", "$sites"));
doc.add(new BasicDBObject("$match", aDBList));
 doc.add(new BasicDBObject().append("$project", siteObject));
AggregationOutput output = coll.aggregate(doc);

【问题讨论】:

  • 你能用你的聚合和 $project 展示你到目前为止所做的尝试吗?
  • @VinceBowdren 问题已更新源代码,谢谢
  • 但是里面好像没有$project子句?
  • 对不起。我又来了。
  • 好的;以及从中得到什么输出?

标签: java arrays mongodb mongodb-java


【解决方案1】:

您可以尝试以下聚合。

使用$map 转换Keywords 数组。

$map 内,使用$arrayElemAt 投影dailyranks 的倒数第二个值,使用$let 运算符保存$arrayAtElem 的结果并投影fild 值。

db.coll.aggregate({
    $project: {
        keywords: {
            $map: {
                input: "$sites.keywords",
                as: "result",
                in: {
                    keyword: "$$result.keyword",
                    fild2: {$let: {vars: {obj: {$arrayElemAt: ["$$result.dailyranks", -2]}},in: "$$obj.fild2"}},
                    fild3: {$let: {vars: {obj: {$arrayElemAt: ["$$result.dailyranks", -1]}},in: "$$obj.fild3"}}
                }
            }
        }
    }
})

Java 等价物

MongoClient mongoClient = new MongoClient();
MongoDatabase db  = mongoClient.getDatabase("db")
MongoCollection<Document> collection = db.getCollection("collection");
List<Document> results =
    collection.aggregate(
        Arrays.asList(
            Aggregates.match(Filters.eq("user", modelLogin.getUSER_NAME() )),
            Aggregates.project(
                Projections.fields(
                    new Document("keywords",
                        new Document("$map",
                        new Document("input", "$sites.keywords").
                        append("as", "result").
                        append("in",
                            new Document("keyword","$$result.keyword").
                                append("fild2",
                                    new Document("$let",
                                    new Document("vars", new Document("obj",
                                            new Document("$arrayElemAt", Arrays.asList("$$result.dailyranks", -2)))).
                                    append("in", "$$obj.fild2" ))).
                                append("fild3",
                                    new Document("$let",
                                    new Document("vars", new Document("obj",
                                            new Document("$arrayElemAt", Arrays.asList("$$result.dailyranks", -1)))).
                                    append("in", "$$obj.fild3" )))
                            )
                        )
                    )))
        )).into(new ArrayList<>());

【讨论】:

  • @veerram Aggregates.project() 中“字段”的用途是什么。编译错误
  • 出现这样的编译错误,没有找到适合聚合(List) 方法的方法 DBCollection.aggregate(DBObject,DBObject...) 不适用
  • 你的mongo java驱动版本是多少?
  • 它是 3.3.0。我只是将它更新到 3.4 但仍然遇到相同的错误
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2012-04-23
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多