2016-02-26 73 views
1

我无法成功提取所有主记录并最终获得阵列。我只提取与“属性”主要记录的字段计数> 0带或不带子阵列记录的聚合记录

数据样本是:

docs = [ 
    { docId : "1", fieldDoc1: "value", fieldDoc2: "value", attributes: [ { attrId: "1.1", fieldAttr1: "value" }, { attrId: "1.2", fieldAttr1: "value" }] }, 
    { docId : "2", fieldDoc1: "value", fieldDoc2: "value", attributes: [ { attrId: "2.1", fieldAttr1: "value" }] }, 
    { docId : "3", fieldDoc1: "value", fieldDoc2: "value", attributes: [ ] } 
    ]; 

db.table.aggregate ( 
    { $match: { criterias on main part fields }, 
    { $unwind: "attributes" }, 
    { $match: { criteria on attributes fields }, 
    { $group : { 
      _id : "$docId", 
      "docs": { 
       "$push": { 
        "_id": "$docId", 
        "fieldDoc1": "$fieldDoc1", 
        "fieldDoc2": "$fieldDoc2", 
        "attributes": "$attributes"} 
       } 
     } }); 

对于为例,用于提取所有的记录,我尝试:

db.table.aggregate ( 
     { $unwind: "attributes" }, 
     { $group : { 
       _id : "$docId", 
       "docs": { 
        "$push": { 
         "_id": "$docId", 
         "fieldDoc1": "$fieldDoc1", 
         "fieldDoc2": "$fieldDoc2", 
         "attributes": "$attributes"} 
        } 
      } }); 

只有我获取docId:“1”和docId:“2”及其属性。 docId:不返回没有属性的“3”。

1)那么如何获得所有相应的记录,有或没有属性;

2)如何获得主要部分的各个领域,没有列举这些literaly(fieldDoc1: “$ fieldDoc1”,fieldDoc2 “:” $ fieldDoc2" ,等等

问候

回答

0

其中字段存在,即使是空或空$exists: true将匹配这些文件

db.table.aggregate (
    { $match: { attributes : { $exists: true }} }, 
    { $unwind: "attributes" }, 
    { $group : { 
      _id : "$docId", 
      "docs": { 
       "$push": { 
        "_id": "$docId", 
        "fieldDoc1": "$fieldDoc1", 
        "fieldDoc2": "$fieldDoc2", 
        "attributes": "$attributes"} 
       } 
     } }); 
+0

恩,这不适合我。我认为这个解决方案是由mongodb 3.2提供的,并带有以下选项:$ unwind:{path:,preserveNullAndEmptyArrays:true}。但我无法更新我的框架。 – maiagarbot

0

最好的答案,我发现是更新蒙戈释放3.2,然后使用$放松:{路径:,preserveNullAndEmptyArrays:真正}这完美地起作用