我有一堆文件,这是一个较小的原型(原始文件有更多的字段,但这些对于这个问题并不重要):
{"_id": {"$oid" : "53fedbcdd1d73a2502de6ae0"}, "commonID": "12345", "name": "Bus tour", "option_name" : "Morning tour"}
本文件代表旅游选项。通过commonID将多个游览选项组合在一起。现在我想要一个独特的旅行列表,所以不是每个选项。每次巡演只有一个选项。
例如: 在阿姆斯特丹的某个旅游被称为"巴士旅游"。有多种选择,例如:"晨游","下午旅游","晚间旅游"。我只想要一个带有commonID" 12345"的文档。但这适用于该系列中的所有巡演。
我读到了mapReduce和Aggregation Pipelines,但我无法找到如何处理这种情况。也许你可以建议我可以阅读的一些选项或例子。
答案 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的文档,如果可能的话,包含所有选项的列表!"