我有一堆文档,这是一个较小的原型(原始文档有更多的字段,但它们对于这个问题并不重要):
{"_id": {"$oid" : "53fedbcdd1d73a2502de6ae0"}, "commonID": "12345", "name": "Bus tour", "option_name" : "Morning tour"}此文档表示一个旅游选项。多个旅游选项由commonID组合在一起。现在我想要一张独特的旅游清单,所以不是所有的选择。每次旅行只有一种选择。
例如:阿姆斯特丹的某一次旅游被称为“巴士之旅”。有多种选择,如:“晨游”、“下午游”、“夜游”。我只想要一个commonID "12345“的文档。但这是所有的旅行团的收藏品。
我阅读了mapReduce和聚合管道,但是我无法找到如何处理这种情况。也许你可以建议一些选项或例子,我可以阅读。
发布于 2014-08-28 09:58:42
如果要使用聚合框架,则聚合管道应该如下所示:
collection.aggregate( [ { $group: { _id: "$commonID", name : "$name", description : "$description", options: { $addToSet : {option: "$option_name", discrition :"$option_discription" }, ... } }])取决于如何将数据分组。
发布于 2014-08-28 10:18:25
以下面的数据集为例:
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“,您都可以很容易地获得与输出中的两个数组相关联的映射,可以将”名称“和”选项“作为键值对一起考虑,其中包含名称->键和选项->值。因此,对于id -> "12345",存在四个名称,每个名称都有一个选项。您可以在客户端API中删除重复的键和值映射。
查询以下内容:
db.test.aggregate([{$group:{"_id":"$commonID","name":{$push:"$name"},"options"{$push:"$option_name"}}}])更新w.r.t到您的评论:
“如果可能的话,每个commonID都有一个包含所有选项列表的文档!”
https://stackoverflow.com/questions/25545537
复制相似问题