Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 使用Mongo聚合查询将子项与父项关联_Mongodb_Scala_Casbah - Fatal编程技术网

Mongodb 使用Mongo聚合查询将子项与父项关联

Mongodb 使用Mongo聚合查询将子项与父项关联,mongodb,scala,casbah,Mongodb,Scala,Casbah,我有一个名为assets的集合,其中包含2+格式的文档,即ParentObject和ChildObject。我目前正在使用两个查询将ParentObject与ChildObject关联。这可以通过聚合查询完成吗 父对象 { "_id" : { "oid" : "ParentFooABC", "brand" : "acme" }, "type": "com.ParentClass", "title": "Title1234",

我有一个名为assets的集合,其中包含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版本:db版本v2.6.11

语言:Scala


驱动程序:Casbah 2.8.1从技术上讲是的,但是您现在所做的是mongodb的标准实践。如果您需要频繁地加入数据集合,您可能应该使用RDBMS。但是,如果您偶尔需要从两个单独的集合中聚合数据,则存在以下问题。通常,您会发现自己经常从另一个文档将数据填充到文档中,但文档数据库通常就是这样工作的。当你真的在寻找一个与SQL
JOIN
等价的东西时,我不推荐使用
$lookup
。这并不是你真正想要的,你最好还是做你现在正在做的事情或者转向RDBMS

补充: 由于数据在同一个集合中,您可以使用聚合将该数据聚合到一起。您只需根据
\u id.brand
对它们进行分组即可

一个快速示例(在mongodb shell中):


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

感谢您的快速响应!我犯了一个错误,最初没有包括我的Mongo版本号,并且$lookup对我不可用。虽然看起来我在执行连接,但ParentObject和ChildObject实际上都在同一个集合中。我希望用$match获取所有文档,然后在同一个聚合中比较它们pipeline@KevinHarper是的,那是最近才加的。通常,您会将父对象和子对象放在不同的集合中,在子对象或父对象文档中存储一个id作为引用,然后根据父对象的id查询子对象,或者根据存储在父对象中的子对象id数组进行查询。我完全没有注意到你把它们放在同一个系列里。但是,您可能可以通过
\u id.brand
从每个文档中获取您需要的任何数据,使用当前方法。@KevinHarper您应该更新您的问题,我将更新我的答案以匹配它。你用什么语言?在你的问题上加上标签可能会有帮助。很好的建议。我已经用Mongo版本、语言(Scala)和驱动程序(Casbah)@KevinHarper更新了我的问题。我没有使用Casbah的经验,但是我可以提供一些示例作为mongodb查询,而不是使用Casbah DSL格式化。那可以接受吗?
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"}
   }
}
]);