Mongodb 选择mongo db中的嵌套字段
我在mongodb中有一个集合,其中字段嵌套在语言根目录下:Mongodb 选择mongo db中的嵌套字段,mongodb,Mongodb,我在mongodb中有一个集合,其中字段嵌套在语言根目录下: { en: { title: "eng title", content: "eng content", }, it: { title: "it title", content: "it content" } //common attributes for all languages images: { mai
{
en: {
title: "eng title",
content: "eng content",
},
it: {
title: "it title",
content: "it content"
}
//common attributes for all languages
images: {
mainImage: "dataURL",
thumbImage: "dataURL"
}
}
我有一个变量叫做“currentLang”;我需要通过标题查找文档,只选择“currentLang”对象和公共字段(本例中的图像);
但是对于“currentLang”对象,我希望输出文档不嵌套;例如,使用currentLang=“en”
期望输出:
{
title: "eng title",
content: "eng content",
images: {
mainImage: "dataURL",
thumbImage: "dataURL"
}
}
这可能吗?您需要按以下方式进行聚合:
- 构造一个
对象,只匹配包含()语言的记录find
- 构造一个
对象来投影字段投影
我不确定您是如何查询的,因此我假设您直接通过mongo客户端进行查询。假设您已经定义了一个变量
>currentLang = "en";
您可以运行并使用,重新构造文档的表示形式
下面是我测试过的一个示例:
> db.test.aggregate({$project:
{_id: 0,
title: "$" + currentLang + ".title",
content: "$" + currentLang + ".content",
images: 1
}
}).pretty();
{
"images" : {
"mainImage" : "dataURL",
"thumbImage" : "dataURL"
},
"title" : "eng title",
"content" : "eng content"
}
如果要将其与实际查询相结合,可以将其作为
> db.test.aggregate(
{$match:
{"en.title": "eng title"}
},
{$project:
{_id: 0,
title: "$" + currentLang + ".title",
content: "$" + currentLang + ".content",
images: 1
}
}).pretty();
这正是我现在使用的代码;但输出文档仍嵌套在“en”下;我希望将根元素中的所有字段都写入所需的输出above@CerealKiller然后需要聚合,以使用别名投影字段。请查看更新的答案。好的,这是正确的;不幸的是,我在Meteor.js中使用mongo,在这里似乎不支持聚合;抱歉,当我写这个问题时,我不知道…@Ceralkiller没问题。-看看这是否有帮助。或者,您可以发布一个新问题,询问如何使用meteor完成此操作。这不是非常重要,但要遵循标准——因为前3个obj键是静态的和已知的,您可能希望使用
project.title=
而不是project[“title”]=
(您可以使用点表示法在obj内部动态创建新字段-如果未定义,只要它不是嵌套的未定义字段就可以了)
> db.test.aggregate(
{$match:
{"en.title": "eng title"}
},
{$project:
{_id: 0,
title: "$" + currentLang + ".title",
content: "$" + currentLang + ".content",
images: 1
}
}).pretty();