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'集合的其他訂閱而結束工會)。我在客戶端進行過濾(即,我在客戶端檢測到哪些數組是空的,只顯示填充數組)。

如果這裏有人知道一個簡單的聚合管道來實現這個功能,我仍然樂意學習。