如何格式化MongoDB查询结果?

6
我有一个收集数据的集合,存储格式如下:
{
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"),
    name: 'sfdsfsdfsdfsdfsd'
    details: {
        varA: {
            created: "2013-06-13T12:43:25.853Z",
            validity: "2013-07-13T12:43:25.853Z",
            modified: "2013-06-13T12:43:25.853Z"
        },
        varB: {
            created: "2013-06-13T12:43:25.853Z",
            validity: "2013-07-13T12:43:25.853Z",
            modified: "2013-06-13T12:43:25.853Z"
        }
    }
}

我希望能够以以下格式(不含嵌套深度)仅公开varA数据:
{ 
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"),
    name: 'sfdsfsdfsdfsdfsd',
    created: "2013-06-13T12:43:25.853Z",
    validity: "2013-07-13T12:43:25.853Z",
    modified: "2013-06-13T12:43:25.853Z"
}

很遗憾,我的查询(使用投影):

db.coll.find({}, {'details.varB': 0})

返回类似于这样的内容:

{
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"),
    name: 'sfdsfsdfsdfsdfsd',
    details: {
        varA: {
            created: "2013-06-13T12:43:25.853Z",
            validity: "2013-07-13T12:43:25.853Z",
            modified: "2013-06-13T12:43:25.853Z"
        }
}

我该如何改进查找查询以返回预期格式?谢谢那些愿意帮助我的人;-)顺便说一下,我正在使用mongo shell检索数据,但我需要通过node.js和node-mongodb-native使此查询工作。

我建议你考虑在客户端(使用NodeJS)完成繁忙的工作,而不是让数据库服务器额外做一些工作来将数据以不同的格式投影出来。 - WiredPrairie
1个回答

5

我只使用了聚合函数完成了这个操作,详细说明请查看我的博客文章这里

针对您的情况,这个方法可以使用

db.temp.aggregate (
   {
      $project : 
      {
         name:"$name",
         created:"$details.varA.created",
         validity:"$details.varA.validity",
         modified:"$details.varA.modified"
      }
   }
);

或者
db.temp.aggregate ({$project:{name:"$name",created:"$details.varA.created",validity:"$details.varA.validity",modified:"$details.varA.modified"}});

这是一个示例运行

> db.temp.insert ({name:'sfdsfsdfsdfsdfsd', details: { varA : { created: "2013-06-13T12:43:25.853Z", validity: "2013-07-13T12:43:25.853Z", modified: "2013-06-13T12:43:25.853Z"}, varB : { created: "2013-06-13T12:43:25.853Z", validity: "2013-07-13T12:43:25.853Z", modified: "2013-06-13T12:43:25.853Z" } } })
> db.temp.aggregate ({$project:{name:"$name",created:"$details.varA.created",validity:"$details.varA.validity",modified:"$details.varA.modified"}});
{
        "result" : [
                {
                        "_id" : ObjectId("51b9d7151723a9c4d6bc9936"),
                        "name" : "sfdsfsdfsdfsdfsd",
                        "created" : "2013-06-13T12:43:25.853Z",
                        "validity" : "2013-07-13T12:43:25.853Z",
                        "modified" : "2013-06-13T12:43:25.853Z"
                }
        ],
        "ok" : 1
}

谢谢@thefourtheye。这就是我一直在寻找的。有没有一种方法可以聚合此查询的所有其他字段?我的集合中还有20个字段,我想在结果中显示它们,我应该在$project运算符中列出它们吗? - Michael
是的。如果您想要在查询结果中展开或重命名标题,则必须提及所有字段名称。 - thefourtheye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接