mongodb - $lookup 多个级别
问题描述
目前我有这个查询:
Post.find().populate([
{
path: 'page',
populate: {
path: 'url',
populate: {
path: 'i18n',
match: {
locale: 'es_ES'
}
}
}
}
]);
结果,我得到:
{
"title": "Title Post",
"page": {
"title": "Title Page",
"url": [
{
"url": "/english",
"i18n": null
},
{
"url": "/spanish",
"i18n": {
"name": "Spanish",
"iso": "es",
"locale": "es_ES",
}
}
]
}
}
并url
在查询后过滤:
let url = posts.page.url.filter(value => {
return value.i18n;
});
我只想加载有条件的url
关系,i18n.locale = es_ES
但我不知道该怎么做。想要的结果:
{
"title": "Title Post",
"page": {
"title": "Title Page",
"url": [
{
"url": "/spanish",
"i18n": {
"name": "Spanish",
"iso": "es",
"locale": "es_ES",
}
}
]
}
}
我努力了:
Post.find().populate([
{
path: 'page',
populate: {
path: 'url',
match: {
'i18n.locale': 'es_ES'
}
}
}
]);
但不是有效的过滤器。
楷模:
module.exports = mongoose.model('i18n', new Schema({
name: String,
iso: String,
locale: String
}));
module.exports = mongoose.model('page', new Schema({
title: Object,
url: [{
type: Schema.Types.ObjectId,
ref: 'url'
}]
));
module.exports = mongoose.model('post', new Schema({
title: Object,
page: {
type: Schema.Types.ObjectId,
ref: 'page'
}
}));
module.exports = mongoose.model('url', new Schema({
url: String,
i18n: {
type: Schema.Types.ObjectId,
ref: 'i18n'
}
}));
我正在使用 MongoDB 服务器版本 3.6.6 和 mongoose 5.2.6。
谢谢!
解决方案
您可以在 mongodb 3.6 中尝试以下聚合
Post.aggregate([
{ "$lookup": {
"from": Page.collection.name,
"let": { "page": "$page" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$_id", "$$page" ] } } },
{ "$lookup": {
"from": Url.collection.name,
"let": { "url": "$url" },
"pipeline": [
{ "$match": { "$expr": { "$in": [ "$_id", "$$url" ] } } },
{ "$lookup": {
"from": i18n.collection.name,
"let": { "i18n": "$i18n" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$_id", "$$i18n" ] } } }
],
"as": "i18n"
}},
{ "$addFields": {
"i18n": { "$arrayElemAt": [ "$i18n", 0 ] }
}}
],
"as": "url"
}}
],
"as": "page"
}},
{ "$unwind": "$page" }
])
推荐阅读
- c - 如何让 VSCode Intellisense 使用 ANSI C/自定义参数?
- python - 在 Logistic 回归中使用 sklearn 中的 accuracy_score 时出错
- julia - 错误:curl_easy_setopt:48 @ Downloads.Curl
- java - 如何将方法的返回值用作另一个方法的参数?
- flutter - 如何在自定义画家的矩形之间添加空间/填充?
- java - 在 DeserializationProblemHandler (Jackson) 中获取父 json 字符串
- android - 在协调器布局中手动插入 FAB 或子视图
- python - 使用表单测试管理员自定义操作
- python - 计算每个元素的出现次数
- python - 如何使 TypeError:'NoneType' 类型的对象没有 len() 与刽子手游戏消失