首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$lookup多个级别

$lookup多个级别
EN

Stack Overflow用户
提问于 2018-08-01 21:59:52
回答 1查看 54关注 0票数 1

目前我有这样的查询:

代码语言:javascript
复制
Post.find().populate([
    {
        path: 'page',
        populate: {
            path: 'url',
            populate: {
                path: 'i18n',
                match: {
                    locale: 'es_ES'
                }
            }
        }
    }
]);

结果,我得到了:

代码语言:javascript
复制
{
    "title": "Title Post",
    "page": {
        "title": "Title Page",
        "url": [
            {
                "url": "/english",
                "i18n": null
            },
            {
                "url": "/spanish",
                "i18n": {
                    "name": "Spanish",
                    "iso": "es",
                    "locale": "es_ES",
                }
            }
        ]
    }
}

查询后过滤url

代码语言:javascript
复制
let url = posts.page.url.filter(value => {
    return value.i18n;
});

我只想加载带有i18n.locale = es_ES条件的url关系,但是我不知道怎么做。想要的结果:

代码语言:javascript
复制
{
    "title": "Title Post",
    "page": {
        "title": "Title Page",
        "url": [
            {
                "url": "/spanish",
                "i18n": {
                    "name": "Spanish",
                    "iso": "es",
                    "locale": "es_ES",
                }
            }
        ]
    }
}

我试过了:

代码语言:javascript
复制
Post.find().populate([
    {
        path: 'page',
        populate: {
            path: 'url',
            match: {
                'i18n.locale': 'es_ES'
            }
        }
    }
]);

但不是有效的筛选器。

型号:

代码语言:javascript
复制
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。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-08-02 01:03:01

你可以在mongodb 3.6中尝试下面的聚合

代码语言:javascript
复制
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" }
])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51635269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档