mongodb - 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"));
...这将返回原始文档,但无法加入翻译。
问题是流水线阶段的语法相当令人费解。我想知道是否有人可以对此有所了解?
- 单元测试示例不使用(或需要?)“$$origDsId”中看到的双 $ 形式?从 MongoDB 文档中,我了解到这种形式用于引用外部定义的变量(例如,在“管道”之前的“let”赋值中),但它们在引用的示例中也不起作用;
- 静态 ArrayExpression“数组”的作用是什么?它看起来好像是一种分配容器,其中
Expressions.of().field("$eq", array(field("dsId"), field("$origDsId")))
可能意味着类似"dsId" = "$origDsId"
- 这将是我需要的(如果它可以工作;)) - 我尝试了各种组合,使用
field("$origDsId")
,value("$origDsId")
,field("$$origDsId")
,value("$$origDsId")
, 等等,但到目前为止还没有运气。
提前致谢!
解决方案
推荐阅读
- python - 如何在 Windows 10 的 Pycharm 上使用 ThunderSVM(GPU 模式)
- assembly - 多条 nop 指令不会始终比单条 nop 指令花费更长的时间
- javascript - 为什么是vue invalid with v-bind:src?
I want to dynamically switch html content, so I used vue-loader src to import, but v-bind:src doesn't take effect at all.
<template src="./app.html"></template>
- typescript - 如果可选参数被指定为特定值,则返回类型“从不”
- android - 您必须提供 layout_height 属性
- c# - 我正在尝试为使用按钮做出的选择编写一个过滤器
- r - ggplot中的斜体希腊字母
- php - 使用 Angular JS 和 PHP 上传文件
- php - 使用带有 IP/用户名路径的 Codeigniter
- python - 如何在python中将网络十六进制字符串转换为整数