首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个文档共享一个commonID,每个commonID只返回一个文档

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

Stack Overflow用户
提问于 2014-08-28 09:38:45
回答 2查看 52关注 0票数 0

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

代码语言:javascript
复制
{"_id": {"$oid" : "53fedbcdd1d73a2502de6ae0"}, "commonID": "12345", "name": "Bus tour", "option_name" : "Morning tour"}

此文档表示一个旅游选项。多个旅游选项由commonID组合在一起。现在我想要一张独特的旅游清单,所以不是所有的选择。每次旅行只有一种选择。

例如:阿姆斯特丹的某一次旅游被称为“巴士之旅”。有多种选择,如:“晨游”、“下午游”、“夜游”。我只想要一个commonID "12345“的文档。但这是所有的旅行团的收藏品。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-28 09:58:42

如果要使用聚合框架,则聚合管道应该如下所示:

代码语言:javascript
复制
collection.aggregate( [ { $group: { _id: "$commonID", name : "$name", description : "$description", options: { $addToSet : {option: "$option_name", discrition :"$option_discription" }, ... } }])

取决于如何将数据分组。

票数 0
EN

Stack Overflow用户

发布于 2014-08-28 10:18:25

以下面的数据集为例:

代码语言:javascript
复制
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"});

对于您的需求,您可以实现以下结果:

代码语言:javascript
复制
{ 
  "_id" : "12345", 
  "name" :    [ "Bus tour", "Bus tour", "Bus tour", "Car tour" ],
  "options" : [ "Morning tour", "Afternoon tour", "Evening tour", "Evening tour" ]
}

对于每一个"commonID“,您都可以很容易地获得与输出中的两个数组相关联的映射,可以将”名称“和”选项“作为键值对一起考虑,其中包含名称->键和选项->值。因此,对于id -> "12345",存在四个名称,每个名称都有一个选项。您可以在客户端API中删除重复的键和值映射。

查询以下内容:

代码语言:javascript
复制
db.test.aggregate([{$group:{"_id":"$commonID","name":{$push:"$name"},"options"{$push:"$option_name"}}}])

更新w.r.t到您的评论:

“如果可能的话,每个commonID都有一个包含所有选项列表的文档!”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25545537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档