在我的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函数?还有我想知道这对性能有何影响)。
我一直在寻找不同的文章而且令人困惑:似乎对这个话题没有真正的共识。
他们中的一些选择单独的翻译集合(似乎难以维护已删除的文本),其他人通过选择整个文本并过滤它们(当有多种语言时这似乎是一个不好的选择:很多帖子处理),甚至将它们发送到客户端(发送那些未使用的数据似乎效率低下)。