Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 选择mongo db中的嵌套字段_Mongodb - Fatal编程技术网

Mongodb 选择mongo db中的嵌套字段

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

我在mongodb中有一个集合,其中字段嵌套在语言根目录下:

{
    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();