Meteor Publish获取非空数组

时间:2016-11-14 07:51:02

标签: mongodb meteor

这个问题让我疯狂。我需要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:[],
         }
       }      
    ]
}

在这个例子中,你看到我有一个' tue'用空数组(看看结尾)。我想要获取所有章节.tue'这不是空的。 请注意,我不希望仅整个文档(在此示例中)' pages.id',' pages.name',' pages.picture'以及来自" chapters.tue'的所有字段。那些非空的数组(' chapter.tue') 保证章节将始终具有一周中每天的数组,但这些数组本身可能有也可能没有元素。当填充这些数组时,结构总是相同的(在上面的例子中,你将始终拥有chapter1,你将在数组中始终拥有chapter2)。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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'}}        
    }    
 ])

答案 1 :(得分:0)

这是我最终做的解决方案 - 我发现了一个可以用来从MongoDB聚合中获得反应的'反应聚合'包。 但是,聚合不适合我,因为它变得非常复杂。对于我认为应该简单的事情的双重投影和双重分组。我不想将我的集合分解成较小的集合,因为这个结构对我来说很有意义(书有页面,每个页面都有章节,在这种情况下,章节分布在一周中的几天)。要开始将此集合分解为多个集合,以便我可以“分组”将我带回SQL服务器。

我最终在集合上使用'find'来投影我需要的字段。麻烦是“查找”在文档级别上工作,因此您仍然可以获得空数组。我使用了一个名为'publish-composite'的Meteor包来将此订阅发布到仅客户端集合中(因此我最终没有与我在我的应用程序中为相同'书籍'集合的其他订阅结合)。我在客户端上进行过滤(也就是说,我在客户端检测到哪些数组是空的,只显示填充的数组)。

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