来自MongoDB集合中各个字段的不同值

我正在使用node-mongodb-native使用节点js来引发mongodb查询。 有一个集合名称“位置”,它具有以下字段:

sublocality1sublocality2sublocality3city

我想从这些领域取得总体不同的价值观。

例如:文件:

 { 'sublocality1':'a', 'sublocality2':'a', 'sublocality3': 'b', 'city': 'c' } { 'sublocality1':'b', 'sublocality2':'a', 'sublocality3': 'b', 'city': 'a' } 

该查询应该返回

 ['a' , 'b', 'c'] 

我试过以下:

 Run distinct queries for each of the fields: collection.distinct('sublocality1',..){}, collection.distinct('sublocality2',..){}, collection.distinct('sublocality3',..){}, collection.distinct('city',..){} 

将这些查询的结果插入到列表中,然后在列表中search不同的项目。

我可以优化这个吗? 是否有可能运行一个单一的查询?

您可以在数据库服务器上将其聚合,如下所示:

  • Group单个文档,获取数组中每个预期字段的值。
  • 使用$ setUnion运算符,将名为values的字段投影为所有预期字段值的union
  • Unwind值。
  • Group所有loggingGroup ,以获得不同的值。

码:

 Collection.aggregate([ {$group:{"_id":"$_id", "sublocality1":{$push:"$sublocality1"}, "sublocality2":{$push:"$sublocality2"}, "sublocality3":{$push:"$sublocality3"}, "city":{$push:"$city"}}}, {$project:{"values":{$setUnion:["$sublocality1", "$sublocality2", "$sublocality3", "$city"]}}}, {$unwind:"$values"}, {$group:{"_id":null,"distinct":{$addToSet:"$values"}}}, {$project:{"distinct":1,"_id":0}} ],function(err,resp){ // handle response }) 

样本o / p:

 { "distinct" : [ "c", "a", "b" ] } 

如果您想要对结果进行sorting,则可以在最终project阶段之前在pipe道中应用sort阶段。