2016-11-14 73 views
0

这个问题让我发疯。我需要Meteor.publish中的代码来获得非空的对象数组。流星发布获取非空阵列

样本结构(这里字段名是任意的,我只是呈现结构)图所示 -

Books:{ 
    _id:'xyz', 
    name:'book1', 
    image:[binary array], 
    pages:[ 
     { 
      id:1, 
      name:'page1', 
      author:'ueye', 
      picture:[binary array] 
      chapters:{ 
       mon:[ 
       { 
        chapter1:'zzz', 
        chapter2:'xxx' 
       } 
      ],  
      tue:[ 
       { 
        chapter1:'123', 
        chapter2:'yyy' 
       } 
      ], 
      wed:[], 
      thu:[], 
      fri:[], 
      wkd:[], 
      } 
     },      
     { 
     id:2, 
     name:'page2', 
     author:'asfnwro', 
     picture:[binary array], 
     chapters:{ 
       mon:[ 
       { 
        chapter1:'xyz', 
        chapter2:'uuu' 
       } 
      ],  
      tue:[], 
      wed:[ 
       { 
       chapter1:'7777', 
       chapter2:'ieismxi', 
       } 
      ], 
      thu:[], 
      fri:[], 
      wkd:[], 
     } 
     }  
    ] 
} 

在这个例子中,你看,我有一个“星期二”空数组(看结束)。我想获取所有不为空的'chapters.tue'。 请注意,我不希望仅整个文档(在此示例中)为'pages.id','pages.name','pages.picture'和所有来自'chapters.tue'的字段用于这些数组('chapters.tue ')不是空的。 确保章节在每周的每一天都会有数组,但这些数组本身可能有也可能没有元素。当这些数组填充时,结构总是相同的(在上例中,您将始终拥有chapter1,并且您将始终拥有数组中的chapter2)。

谢谢你的帮助。

回答

0

到目前为止,我得到了这一点 -

db.myDoc.aggregate([ 
    {$match:{'_id':'xyz'}}, 
    {$unwind:'$pages'}, 
    {$match:{'pages.chapters.tue':{$not:{$size:0}}}}, 
    {$project:{'name':1, 'pages.chapters.tue':1}}, 
    {$group:{'_id': '$_id','name': {$first:'$name'}, 
     'chapters': { $addToSet:'$pages.chapters.tue'}}   
    }  
]) 
+0

不能使用蒙戈聚集一起来看流星发布,只有流星方法 – Khang

+0

那么任何建议,我怎么能完成以上流星发布? – RichardAu

+0

我认为你应该分开你的收藏,创建三个独立的集合:'myDoc','pages','bags' – Khang

0

这是我最后做的解决方案 - 我发现了一个包“活性骨料”可以使用从MongoDB的聚合反应得到。 但是,聚合并不适合我,因为它变得相当复杂。双重预测和双重分组对于我认为应该很简单的事情。我不想将我的藏书分成较小的藏品,因为这种结构对我来说很有意义(书本有页面,每页都有章节,在这种情况下,章节分散在一周中)。要开始将此集合分解为多个集合,以便我可以'按分组'将我带回SQL Server。

我最终在集合上使用'find'来获取所需字段的投影。麻烦是'查找'在文档级别工作,所以你仍然得到空阵列。我使用名为'publish-composite'的Meteor软件包将此订阅发布到仅限客户端的集合中(这样我就不会因为我的应用程序中针对相同'books'集合的其他订阅而结束工会)。我在客户端进行过滤(即,我在客户端检测到哪些数组是空的,只显示填充数组)。

如果这里有人知道一个简单的聚合管道来实现这个功能,我仍然乐意学习。