来自MongoDB集合中各个字段的不同值
我正在使用node-mongodb-native使用节点js来引发mongodb查询。 有一个集合名称“位置”,它具有以下字段:
sublocality1
, sublocality2
, sublocality3
, city
。
我想从这些领域取得总体不同的价值观。
例如:文件:
{ '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
阶段。