【问题标题】:Filtering nested array in Mongo Java driver在 Mongo Java 驱动程序中过滤嵌套数组
【发布时间】:2023-04-02 08:37:01
【问题描述】:

以下 NoSQL 查询返回特定用户的所有评论:

db.getCollection('catalog-review').aggregate([
{
     $project: {
       reviews: {
         $filter: {
           input: "$reviews",
           as: "review",
           cond: { $eq: [ "$$review.userId", 121 ] }
          }
        }
      }
}
])

这是查询工作正常,但如果我使用 Mongo 驱动程序在 Java 中实现它,“$$”不起作用。

List<CatalogReview> reviews = collection.aggregate(Arrays.asList(
            new Document("$project", new Document("reviews", new Document("$filter", new Document("input", "$reviews")
                    .append("as", "review").append("cond", new Document("$eq", Arrays.asList(new Document("$$review.userId", 121)))))))
    )).into(new ArrayList<>());

错误信息:

com.mongodb.MongoCommandException: Command failed with error 15999: 'invalid operator '$$review.userId'' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "invalid operator '$$review.userId'", "code" : 15999 }

Mongo 驱动支持聚合函数吗?

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    问题是Arrays.asList(new Document("$$review.userId", 121))。应该是Arrays.asList("$$review.userId", 121)

    Arrays.asList(new Document("$$review.userId", 121)) = [ { "$$review.userId" : 121 } ]

    Arrays.asList("$$review.userId", 121) = [ "$$review.userId", 121 ]

    sn-p 应该如下所示:

    List<CatalogReview> reviews = collection.aggregate(Arrays.asList(
                new Document("$project", new Document("reviews", new Document("$filter", new Document("input", "$reviews")
                        .append("as", "review").append("cond", new Document("$eq", Arrays.asList("$$review.userId", 121))))))
        )).into(new ArrayList<>());
    

    【讨论】:

    • 像魅力一样工作!谢谢。
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多