首页 > 解决方案 > Morphia 聚合查找语法?

问题描述

我正在尝试在 MongoDB v. 4.4.3 上的两个集合之间实现三个字符串字段的连接:一个包含原始文档,另一个包含翻译。两种文档类型如下所示:

{
   "_id" : ObjectId("60644367b521563be8044f07"),
   "dsId" : "2051918",
   "lcId" : "data_euscreenXL_EUS_15541BBE705033639D4E06691D7A5D2E",
   "pgId" : "1",
   (...)

这个 MongoDB 查询可以满足我的需要,将翻译嵌入结果中:

db.Original.aggregate([
   {  $match: { query parameters } },
   {  $lookup:
     {
       from: "Translation",
       let: { "origDsId": "$dsId", origLcId: "$lcId", "origPgId": "$pgId" },
       pipeline: [
          { $match:
             { $expr:
                { $and:
                   [
                     { $eq: [ "$dsId",  "$$origDsId" ] },
                     { $eq: [ "$lcId",  "$$origLcId" ] },
                     { $eq: [ "$pgId",  "$$origPgId" ] }
                   ]
                }
             }
          },
          { $project: { dsId: 0, _id: 0 } }
       ],
       as: "translations"
     }
}])

但是,我不知道如何编写等效的 Morphia 查询。我更新到 Morphia v.2.2,它添加了所需的功能,但它都是非常新的,还没有在morphia.dev上记录;我也找不到更多关于Javadoc的内容。Github 上的这个 Morphia 单元测试看起来很有趣,我尝试复制这种方法:

Aggregation<Original> query = datastore.aggregate(Original.class)
           .match(eq("dsId", datasetId), eq("lcId", localId))
           .lookup(Lookup.lookup(Translation.class)
                   .let("origDsId", value("$dsId"))
                   .let("origLcId", value("$lcId"))
                   .let("origPgId", value("$pgId"))
           .pipeline(Match.match(expr(Expressions.of()
                   .field("$and",
                         array(Expressions
                              .of().field("$eq",
                                   array(field("dsId"),
                                         field("$origDsId"))),
                               Expressions
                              .of().field("$eq",
                                   array(field("lcId"),
                                         field("$origLcId"))),
                               Expressions
                              .of().field("$eq",
                                   array(field("pgId"),
                                         field("$origPgId"))))))))
                  .as("translations"));

...这将返回原始文档,但无法加入翻译。

问题是流水线阶段的语法相当令人费解。我想知道是否有人可以对此有所了解?

提前致谢!

标签: mongodbaggregation-frameworkmorphia

解决方案


推荐阅读