2013-12-20 109 views
1

我创建了一个使用'parts'键作为'_id'并返回数组中相关联的所有'subparts'数字的聚合查询。来自聚合查询的输出是不受欢迎的,因为我得到了包含74755字典对象的数组'result'。每个对象都包含一个用于_id的int 32和一个用于'#associated_subparts'的数组。我可以通过访问子元素:访问嵌套在数组对象字典中的数组

db.agg_result.find({}, {_id: 0, result: { $slice: [0,2]}})  

但这只是一种位置方法。我尝试嵌套$ elemMatch和$所有查询变种没有成功。例如,我希望能够返回id为468183339的对象。我可能会错误地投影我的原始聚集查询,但我想返回一个没有嵌套的集合,因此集合中的每个对象都是这些部分>子对象中的一个。

实例查询:

var agg_out = db.collection.aggregate({ $group :{ '_id' : "$parts#", 
    'associated_subparts#' : { $addToSet : "$sub_part" }}}); 
db.agg_result.insert(agg_out); 
db.agg_result.find(); 

输出示例:

{ 
    "_id" : ObjectId("52b4c4c6e984c01d69ff176f"), 
    "result" : [ 
     { 
      "_id" : 468183339, 
      "associated_subparts#" : [ 
       -1408237536 
      ] 
     }, 
     { 
      "_id" : 782155933, 
      "associated_subparts#" : [ 
       -1408237536 
      ] 
     }, 
     { 
      "_id" : 1583659973, 
      "associated_subparts#" : [ 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535, 
       -1408237535 
      ] 
     } 
] 
} 

回答

1

如果我正确理解你的问题这时候,来填充agg_result收集正确的方法是将遍历的结果域在将'result'索引的每个子项插入到agg_result集合中之前,您的聚合查询结果文档是这样的:

agg_out.result.forEach(function(x){db.agg_result.insert(x);}); 
+0

嗨Calimero,也许我不清楚,我想保持一对多的关系。这样我可以看到与独特部件相关的所有子部件。例如,汽车A将有轮子X,轮胎Y等等。放松会让我车A - 车轮X然后是另一个记录汽车A - 轮胎Y. – KLDavenport

+0

感谢您的澄清,并对误解感到抱歉 - 刚才意识到您做了恰恰相反与您当前的聚合查询进行比较,然后发布结果集合。希望我的下一次更新会更有帮助! – Calimero

+0

感谢让我重新阅读我只是将“示例数据”更改为“示例结果”,令人困惑。 – KLDavenport