MongoDB 集合中各个字段的不同值
Distinct values from various fields in MongoDB collection
我正在使用 node-mongodb-native 来触发 mongodb 使用节点 js 的查询。
有一个集合名称 'locations',它有以下字段:
sublocality1
, sublocality2
, sublocality3
, city
.
我想从这些字段中获取整体不同的值。
例如:
文件:
{
'sublocality1':'a',
'sublocality2':'a',
'sublocality3': 'b',
'city': 'c'
}
{
'sublocality1':'b',
'sublocality2':'a',
'sublocality3': 'b',
'city': 'a'
}
查询应该return
['a' , 'b', 'c']
我试过以下方法:
Run distinct queries for each of the fields:
collection.distinct('sublocality1',..){},
collection.distinct('sublocality2',..){},
collection.distinct('sublocality3',..){},
collection.distinct('city',..){}
将这些查询的结果插入到一个列表中,并在整个列表中搜索不同的项目。
我可以优化这个吗?是否可以 运行 单个查询?
您可以按如下方式在数据库服务器上聚合它:
Group
单个文档,获取每个预期字段的值
在数组中。
Project
一个名为 values
的字段作为所有预期字段的 union
值,使用 $setUnion 运算符。
Unwind
个值。
Group
所有记录,求不同值。
代码:
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" ] }
如果您希望对结果进行排序,您可以在最后的 project
阶段之前在管道中应用一个 sort
阶段。
我正在使用 node-mongodb-native 来触发 mongodb 使用节点 js 的查询。 有一个集合名称 'locations',它有以下字段:
sublocality1
, sublocality2
, sublocality3
, city
.
我想从这些字段中获取整体不同的值。
例如: 文件:
{
'sublocality1':'a',
'sublocality2':'a',
'sublocality3': 'b',
'city': 'c'
}
{
'sublocality1':'b',
'sublocality2':'a',
'sublocality3': 'b',
'city': 'a'
}
查询应该return
['a' , 'b', 'c']
我试过以下方法:
Run distinct queries for each of the fields:
collection.distinct('sublocality1',..){},
collection.distinct('sublocality2',..){},
collection.distinct('sublocality3',..){},
collection.distinct('city',..){}
将这些查询的结果插入到一个列表中,并在整个列表中搜索不同的项目。
我可以优化这个吗?是否可以 运行 单个查询?
您可以按如下方式在数据库服务器上聚合它:
Group
单个文档,获取每个预期字段的值 在数组中。Project
一个名为values
的字段作为所有预期字段的union
值,使用 $setUnion 运算符。Unwind
个值。Group
所有记录,求不同值。
代码:
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" ] }
如果您希望对结果进行排序,您可以在最后的 project
阶段之前在管道中应用一个 sort
阶段。