2

我有一个包含此文档的数据库:

{"_id":{"$id":"xxx"},"duration":{"sec":137,"usec":0},"name":"test"}

如果我用这个管道调用 db.collection.aggregate:

{$project:{_id: 0, name: 1, duration: 1, seconds: "$duration.sec"}}

我得到这个结果:

{"result":[{"duration":{"sec":137,"usec":0},"name":"test"}],"ok":1}

为什么结果没有“秒”字段?我是否使用了错误的投影语法?

我不完全确定服务器正在运行的 mongodb 版本。我正在使用 1.3.1 php 驱动程序和 php 5.4.3,但服务器可能比这更旧 - 可能大约半年?

4

2 回答 2

3

根据$project上的 MongoDB 文档:

您也可以使用 $project 重命名字段。考虑以下示例:

db.article.aggregate(
 { $project : {
     title : 1 ,
     page_views : "$pageViews" ,
     bar : "$other.foo"
 }} );

该操作将 pageViews 字段重命名为 page_views,并将另一个子文档中的 foo 字段重命名为顶级字段 bar。

该示例似乎与您尝试执行的操作非常匹配。

我知道10gen正式发布了MongoDB v2.2的聚合框架。查看当前的生产版本,我相信它是 2.2.3。如果您在以前的开发版本上运行,聚合可能会发生一些奇怪的事情。

于 2013-03-13T18:58:46.670 回答
0

正如 Bryce 所说,我目前正在通过 shell 使用 MongoDB 2.6,并且 $project 管道正在像您一样重命名嵌套字段。

db.article.aggregate({$project:{'_id': 0, 'name': 1, 'duration': 1, 'seconds': '$duration.sec'}}

我还没有尝试过使用 python 或 php 驱动程序,但我以前使用最后一个 pymongo 的管道运行良好。

于 2014-05-02T08:05:20.763 回答