我有一个名为资产的单一集合,其中包含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
从技术上讲是可以的,但是您现在要做的是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] 删除。
我来说两句