MongoDB:如何获取集合中的对象名称?

时间:2019-11-02 13:20:38

标签: mongodb mongodb-query aggregation-framework

,请事先想好您的帮助。我最近开始将mongoDB用于某些个人项目,并且我想找到一种查询数据的更好方法。

我的问题是:我有以下收藏:

 {
    "_id" : ObjectId("5dbd77f7a204d21119cfc758"),
    "Toyota" : {
            "Founder" : "Kiichiro Toyoda",
            "Founded" : "28 August 1937",
            "Subsidiaries" : [
                    "Lexus",
                    "Daihatsu",
                    "Subaru",
                    "Hino"
            ]
    }
}

{
    "_id" : ObjectId("5dbd78d3a204d21119cfc759"),
    "Volkswagen" : {
            "Founder" : "German Labour Front",
            "Founded" : "28 May 1937",
            "Subsidiaries" : [
                    "Audi",
                    "Volkswagen",
                    "Skoda",
                    "SEAT"
            ]
    }
}

我想在此获取对象名称,例如,我想返回 [丰田,丰田]

我已经使用这种方法          

var names = {}
db.cars.find().forEach(function(doc){Object.keys(doc).forEach(function(key){names[key]=1})});
names;

这给了我以下结果:

{ "_id" : 1, "Toyota" : 1, "Volkswagen" : 1 }

但是,有没有更好的方法来获得相同的结果并仅返回对象的名称。谢谢。

1 个答案:

答案 0 :(得分:0)

我建议您将架构设计更改为:

{
  _id: ...,
  company: {
    name: 'Volkswagen',
    founder: ...,
    subsidiaries: ...,
    ...<other fields>...
}

然后您可以使用聚合框架来实现类似的结果:

> db.test.find()
{ "_id" : 0, "company" : { "name" : "Volkswagen", "founder" : "German Labour Front" } }
{ "_id" : 1, "company" : { "name" : "Toyota", "founder" : "Kiichiro Toyoda" } }

> db.test.aggregate([ {$group: {_id: null, companies: {$push: '$company.name'}}} ])
{ "_id" : null, "companies" : [ "Volkswagen", "Toyota" ] }

有关更多详细信息,请参见:

作为奖励,您可以在company.name字段上创建索引,而不能像示例中那样在各种字段名称上创建索引。