node.js - MongoDB 集合中各个字段的不同值

标签 node.js mongodb node-mongodb-native

我正在使用node-mongodb-native使用 Node js 触发 mongodb 查询。 有一个集合名称“locations”,其中包含以下字段:

sublocality1sublocality2sublocality3城市

我想从这些字段中获取整体不同的值。

例如: 文件:

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

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

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

最佳答案

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

  • Group 单个文档,获取每个预期字段的值 在一个数组中。
  • Project 名为 values 的字段作为所有预期字段的union 值,使用$setUnion运算符。
  • 放松值。
  • 对所有记录进行分组,以获得不同的值。

代码:

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
})

样本输出:

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

如果您希望对结果进行排序,可以在最终 project 阶段之前在管道中应用一个 sort 阶段。

关于node.js - MongoDB 集合中各个字段的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095558/

相关文章:

javascript - 使用 _.each 将动态属性添加到 Mongoose 结果中

node.js - 使用 node.js admin sdk 创建 token 时的 Firebase REST 身份验证

mongodb - Meteor:列出服务器上的所有集合

mongodb - Pymongo 批量插入不起作用

node.js - 限制在 Sails.js 模型中设置字段

node.js - 仅当数组属性存在时,MongoDB 才按数组属性进行过滤

node.js - Node native 驱动程序导致查询内部查询失败

javascript - Shell 中 BaseObject.Prototype 的 Node 打印 'undefined'

node.js - 如何在 Node.js 中处理这个问题

node.js - 更改mongo数据库