【问题标题】:Distinct values from various fields in MongoDB collection来自 MongoDB 集合中各个字段的不同值
【发布时间】:2015-01-22 17:55:39
【问题描述】:

我正在使用node-mongodb-native 使用节点 js 触发 mongodb 查询。 有一个集合名称'locations',它有以下字段:

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',..){}

将这些查询的结果插入一个列表,并在列表中搜索不同的项目。

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

【问题讨论】:

    标签: node.js mongodb node-mongodb-native


    【解决方案1】:

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

    • 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 阶段。

    【讨论】:

    • 谢谢你蝙蝠尖叫。但由于某种原因,它返回的空数组:我试过collection.aggregate([ {$group:{"_id":"$_id", "subLocality1":{$push:"$address_components.subLocality1"}, "subLocality2":{$push:"$address_components.subLocality2"}, "subLocality3":{$push:"$address_components.subLocality3"}, "city":{$push:"$address_components.city"}}}, {$project:{"values":{$setUnion:["$address_components.subLocality1", "$address_components.subLocality2",
    • "$address_components.subLocality3", "$address_components.city"]}}}, {$unwind:"$values"}, {$group:{"_id":null,"distinct":{$addToSet:"$values"}}}, {$project:{"distinct":1,"_id":0}} ],function(err,resp){
    • 为了空间限制,我把我的代码分成两个注释框。 subLocality1、subLocality2 等都是嵌套文档。 "address_components" : { "city" : "Hyderabad", "subLocality1" : "Khairatabad", "subLocality2" : "", "subLocality3" : "", };
    • @ritesh_NITW 你的$project 阶段错了,应该是-{$project:{"values":{$setUnion:["$subLocality1","$subLocality2",...] 等等..
    • 非常感谢。奇迹般有效。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多