使用Mongo聚合查询将孩子与父母联系起来

凯文·哈珀(Kevin Harper)

我有一个名为资产的单一集合,其中包含2种以上格式的文档,ParentObject和ChildObject。我目前正在通过两个查询将ParentObject与ChildObject关联。可以通过汇总查询来完成吗?

父对象

{
    "_id" : {
        "oid" : "ParentFooABC",
        "brand" : "acme"
    },
    "type": "com.ParentClass",
    "title": "Title1234",

    "availableDate": Date,
    "expirationDate": Date
}

子对象

{
    "_id" : {
        "oid" : "ChildFoo",
        "brand" : "acme"
    },
    "type": "com.ChildClass",
    "parentObject": "ParentFooABC",
    "title": "Title1234",
    "modelNumber": "8HE56",
    "modelLine": "Metro",
    "availableDate": Date,
    "expirationDate": Date,
    "IDRequired": true
}

目前,我像这样过滤数据

val parent = db.asset.find(MongoDBObject("_id.brand": MongoDBObject($eq: "acme")),MongoDBObject("type":"com.ParentClass"))
val children = db.asset.find(MongoDBObject("_id.brand": MongoDBObject($eq: "acme")),MongoDBObject("type":"com.ChildClass"), MongoDBObject("parentObject": "${parent._id.oid}"))
if(childs.nonEmpty) {
  //I have confirmed this parent has a child associated and should be returned
  val childModelNumbers = childs.map(child -> child.modelNumber)
  val response = ResponseObject(parent, childModelNumbers)
}

我可以在汇总查询中执行此操作吗?

更新时间

Mongo版本:数据库版本v2.6.11

语言:Scala

司机:卡斯巴2.8.1

tsturzl

从技术上讲是可以的,但是您现在要做的是mongodb的标准做法。如果需要频繁加入数据集合,则可能应该使用RDBMS。但是,如果您偶尔需要聚合来自2个单独集合的数据,则可以使用$ lookup通常,您会发现自己很频繁地数据从另一个文档填充到文档中,但这通常是文档数据库的工作方式。使用$lookup时,你真的找一个相当于SQLJOIN是不是我会建议。这并不是真正的预期目的,最好还是完全按照现在的样子做,或者改用RDBMS。

添加:

由于数据在同一集合中,因此您可以对$group这些数据一起使用汇总您只需要根据将它们分组即可_id.brand

一个简单的例子(在mongodb shell中):

db.asset.aggregate([
{  //start with a match to narrow down
   $match: {"_id.brand": "acme"}
},
{ //group by `_id.brand`
   $group: {
      _id: "$_id.brand",
      "parentObject": {$first: "$parentObject"},
      title: {$first: "$title"},
      modelNumer: {$addToSet: "$modelNumer"}, //accumulate child model # as array
      modelLine: {$addToSet: "$modelLine"}, //accumulate child model line as array
      availableDate: {$first: "$availableDate"},
      expirationDate: {$first: "$expirationDate"}
   }
}
]);

这应该返回将所有子级属性都作为数组(modelNumber,modelLine)分组到父级文档中的文档。做上面的事情可能更好,如果将子级放到他们自己的集合中,而不是文档中字段跟踪他们的类型,那可能会更好type这样,您就知道每个集合中的文档都代表一个给定的数据结构。但是,如果要这样做,则您将无法在示例中执行聚合。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将孩子的记录与父母和祖父母联系起来

来自分类Dev

如何将弱者与弱者联系起来

来自分类Dev

Kibana将两个独立事件联系起来

来自分类Dev

将Netbeans与无业游民联系起来

来自分类Dev

如何将承诺与这个链条联系起来?

来自分类Dev

Laravel分页将问题与设计联系起来

来自分类Dev

如何将热图与直方图联系起来?

来自分类Dev

SQL如何将经理与员工联系起来

来自分类Dev

Drupal-将分类术语与用户联系起来

来自分类Dev

如何将“然后”的承诺与“全部”联系起来

来自分类Dev

将 onkeypress 事件与 if else 语句联系起来?

来自分类Dev

将 excel 数据源与 obiee 分析联系起来

来自分类Dev

如何将实体识别与意图预测联系起来?

来自分类Dev

如何在MySQL中将动态ID与选择查询联系起来

来自分类Dev

如何将Coinbase回调与您网站上的客户联系起来?

来自分类Dev

如何将SKOS概念与其他两个概念的结合联系起来

来自分类Dev

如何将Rails搜索表单与引导搜索设计联系起来?

来自分类Dev

有没有办法将线程的命运与对象联系起来?

来自分类Dev

如何将 esimakin 分页与我的表格联系起来?

来自分类Dev

如何将函数的整数大小与数组的实际大小联系起来?C++

来自分类Dev

as_strided:将步长(conv2d 的步幅)与 as_strided 步幅参数联系起来

来自分类Dev

如何将变量的值与该变量的名称联系起来?

来自分类Dev

ASP.Net MVC:如何将爱好与每个学生联系起来

来自分类Dev

将圆半径与 Python Turtle 中的窗口大小联系起来

来自分类Dev

如何将动作的响应与 rasa 核心中的插槽联系起来?

来自分类Dev

input() 正在将一个答案与另一个答案联系起来

来自分类Dev

如何将未来的结果与颤动中的流联系起来?

来自分类Dev

如何将 FetchXml (ssrs) 中的同一实体与不同的 prefilterparametername 联系起来?

来自分类Dev

如何将 bootstrap 4 中使用的 Facebook 图标与我的实际 facebook 帐户或带有谷歌邮件图标的谷歌邮件联系起来?

Related 相关文章

  1. 1

    将孩子的记录与父母和祖父母联系起来

  2. 2

    如何将弱者与弱者联系起来

  3. 3

    Kibana将两个独立事件联系起来

  4. 4

    将Netbeans与无业游民联系起来

  5. 5

    如何将承诺与这个链条联系起来?

  6. 6

    Laravel分页将问题与设计联系起来

  7. 7

    如何将热图与直方图联系起来?

  8. 8

    SQL如何将经理与员工联系起来

  9. 9

    Drupal-将分类术语与用户联系起来

  10. 10

    如何将“然后”的承诺与“全部”联系起来

  11. 11

    将 onkeypress 事件与 if else 语句联系起来?

  12. 12

    将 excel 数据源与 obiee 分析联系起来

  13. 13

    如何将实体识别与意图预测联系起来?

  14. 14

    如何在MySQL中将动态ID与选择查询联系起来

  15. 15

    如何将Coinbase回调与您网站上的客户联系起来?

  16. 16

    如何将SKOS概念与其他两个概念的结合联系起来

  17. 17

    如何将Rails搜索表单与引导搜索设计联系起来?

  18. 18

    有没有办法将线程的命运与对象联系起来?

  19. 19

    如何将 esimakin 分页与我的表格联系起来?

  20. 20

    如何将函数的整数大小与数组的实际大小联系起来?C++

  21. 21

    as_strided:将步长(conv2d 的步幅)与 as_strided 步幅参数联系起来

  22. 22

    如何将变量的值与该变量的名称联系起来?

  23. 23

    ASP.Net MVC:如何将爱好与每个学生联系起来

  24. 24

    将圆半径与 Python Turtle 中的窗口大小联系起来

  25. 25

    如何将动作的响应与 rasa 核心中的插槽联系起来?

  26. 26

    input() 正在将一个答案与另一个答案联系起来

  27. 27

    如何将未来的结果与颤动中的流联系起来?

  28. 28

    如何将 FetchXml (ssrs) 中的同一实体与不同的 prefilterparametername 联系起来?

  29. 29

    如何将 bootstrap 4 中使用的 Facebook 图标与我的实际 facebook 帐户或带有谷歌邮件图标的谷歌邮件联系起来?

热门标签

归档