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