多个文档共享一个commonID​​,每个commonID​​只返回一个文档

时间:2014-08-28 09:38:45

标签: node.js mongodb

我有一堆文件,这是一个较小的原型(原始文件有更多的字段,但这些对于这个问题并不重要):

{"_id": {"$oid" : "53fedbcdd1d73a2502de6ae0"}, "commonID": "12345", "name": "Bus tour", "option_name" : "Morning tour"}

本文件代表旅游选项。通过commonID​​将多个游览选项组合在一起。现在我想要一个独特的旅行列表,所以不是每个选项。每次巡演只有一个选项。

例如: 在阿姆斯特丹的某个旅游被称为"巴士旅游"。有多种选择,例如:"晨游","下午旅游","晚间旅游"。我只想要一个带有commonID​​" 12345"的文档。但这适用于该系列中的所有巡演。

我读到了mapReduce和Aggregation Pipelines,但我无法找到如何处理这种情况。也许你可以建议我可以阅读的一些选项或例子。

2 个答案:

答案 0 :(得分:0)

如果您想使用聚合框架,您的聚合管道应该类似于:

collection.aggregate( [ { $group: { _id: "$commonID", name : "$name", description : "$description", options: { $addToSet : {option: "$option_name", discrition :"$option_discription" }, ... } }])

取决于您希望如何对数据进行分组

答案 1 :(得分:0)

以下面的数据集为例:

db.test.insert({"commonID": "12345", "name": "Bus tour", "option_name" : "Morning tour"});
db.test.insert({"commonID": "12345", "name": "Bus tour", "option_name" : "Afternoon tour"});
db.test.insert({"commonID": "12345", "name": "Bus tour", "option_name" : "Evening tour"});
db.test.insert({"commonID": "12345", "name": "Car tour", "option_name" : "Evening tour"});

根据您的要求,您可以获得以下结果:

{ 
  "_id" : "12345", 
  "name" :    [ "Bus tour", "Bus tour", "Bus tour", "Car tour" ],
  "options" : [ "Morning tour", "Afternoon tour", "Evening tour", "Evening tour" ]
}

每个" commonID​​"您可以轻松地在输出中获得两个数组的关联映射,您可以考虑" name"和"选项"一起作为键值对,名称为[0] - >键和选项[0] - >值。所以,对于id - > " 12345",存在四个名称,每个名称都有一个选项。您可以在客户端API中删除重复的键,值映射。

实现此目的的查询是:

db.test.aggregate([{$group:{"_id":"$commonID","name":{$push:"$name"},"options"{$push:"$option_name"}}}])

将w.r.t更新为您的评论:

"每个commonID​​的文档,如果可能的话,包含所有选项的列表!"