在Mongo投影中仅返回数组值

8
有没有办法在mongodb投影中仅返回属性的值?例如,我有一个文档,其中一个属性的值是一个数组。我希望查询返回的对象仅为该数组,而不是property:[...]。例如:
文档:
db.test.insert({ name: "Andrew",
   attributes: [ { title: "Happy"},
                 { title: "Sad" }
               ]
});

查询:

db.test.find({name: "Andrew"},{attributes:1, "_id":0});

这将返回:

{ "attributes" : [ { "title" : "Happy" }, { "title" : "Sad" } ] }

我希望它返回数组中的值:
[ { title: "Happy"},
  { title: "Sad" }
]

有没有办法做到这一点?谢谢。

1
不幸的是,MongoDB的投影无法在服务器端像这样工作,您需要在客户端过滤掉它。 - Sammaye
谢谢,那正是我担心的。 - Andrew Serff
1个回答

7

JSON 不允许顶层是一个数组,因此普通查询不允许这样做。但是您可以使用聚合框架来实现:

> db.test.remove();
> db.test.insert({ name: "Andrew", attributes: [ { title: "Happy"}, { title: "Sad" } ] });
> foo = db.test.aggregate( { $match: { name: "Andrew" } }, { $unwind: "$attributes" }, { $project: { _id: 0, title: "$attributes.title" } } );
{
    "result" : [
        {
            "title" : "Happy"
        },
        {
            "title" : "Sad"
        }
    ],
    "ok" : 1
}
> foo.result
[ { "title" : "Happy" }, { "title" : "Sad" } ]

然而,这并不会创建一个类似find方法返回的光标对象。


谢谢,我确实怀疑这个数组不是有效的JSON。感谢您的描述! - Andrew Serff
一个普通的数组是有效的JSON - JSON中的各种数据类型都可以独立存在,并组成一个有效的JSON文档。 - dalgard
2
"JSON不允许顶层是一个数组"这种说法是不正确的。请参考https://dev59.com/ImIk5IYBdhLWcg3wDaYW - Luke

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