使用'$ filter'以及所有其他字段

时间:2016-09-02 08:46:57

标签: mongodb mongodb-query aggregation-framework

在我的product catalog中有类似这样的项目:

[
    {
        "title": "A great Item",
        "ltitle": "a great item",
        "brand": {
            "name": "MyBrand"
        },
        "description": [
            {
                "lang": "en-en",
                "full": "<p>Super great item bla bla bla super great bla bla</p>",
                "short": "Super great item..."
            },
            {
                "lang": "es-es",
                "full": "<p>Producto de muy alta calidad bla bla bla alta calidad etc</p>",
                "short": "Producto de muy..."
            }
        ]
    },
    ...
]

我一直在阅读$elemMatch,但我不确定这是不是我正在寻找的。

我想在localized strings中选择整个项目,但只选择description

我尝试过没有成功:

db.items.find({description: { $elemMatch: { lang: "en-en" } } })

它返回描述中的whole item with both languages

此外,我想知道没有所选语言本地化的项目会发生什么(应该可以选择默认语言)。

也尝试过:

db.items.find({ "description.lang": "en-en"}, { _id:0, description: { $elemMatch: { lang: 'en-en' } } })

db.items.aggregate([
    { $match: { 'description.lang': 'en-en' } },
    { $project: {
        description: {
            $filter: {
                input: '$description',
                as: 'desc',
                cond: { $eq: [ '$$desc.lang', 'en-en'] }
            }
        },
        _id:0
    } }
])

但他们两个都只返回description,而不是其他项目集合。

为了扩展我的问题,我想知道是否可以在多个字段中仅选择本地化文本:

[
    {
        "title": [
            {
                "lang": "en-en",
                "title": "A great Item"
            },
            {
                "lang": "es-es",
                "title": "Un gran producto"
            },
        ],
        "description": [
                {
                    "lang": "en-en",
                    "full": "<p>Super great item bla bla bla super great bla bla</p>",
                    "short": "Super great item..."
                },
                {
                    "lang": "es-es",
                    "full": "<p>Producto de muy alta calidad bla bla bla alta calidad etc</p>",
                    "short": "Producto de muy..."
                }
        ]
    }
]

我想选择整个项目,但使用本地化语言的文本。

有可能吗?如果没有,这是如何解决的? (我想也许在分离本地化的子文档并在选择之后填充它们,或者可能是map-reduce函数?还有我想知道这对性能有何影响)。

我一直在寻找不同的文章而且令人困惑:似乎对这个话题没有真正的共识。

他们中的一些选择单独的翻译集合(似乎难以维护已删除的文本),其他人通过选择整个文本并过滤它们(当有多种语言时这似乎是一个不好的选择:很多帖子处理),甚至将它们发送到客户端(发送那些未使用的数据似乎效率低下)。

0 个答案:

没有答案