【问题标题】:How to format the result of a mongodb find query?如何格式化 mongodb find 查询的结果?
【发布时间】:2013-06-09 22:43:08
【问题描述】:

我有一个以这种格式存储数据的集合:

{
    _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 中)做那些忙碌的工作,而不是让数据库服务器做额外的工作来以不同的格式投影数据。

标签: mongodb node-mongodb-native


【解决方案1】:

正如我的博文here 中所解释的那样,我仅使用聚合函数完成了此操作

对于你的情况,这是可行的

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 运算符中将它们全部列出吗?
  • 是的。如果要在查询结果中展平或重命名标题,则必须提及所有字段名称。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多