2016-11-14 2 views
0

この問題はナットを運転しています。 Meteor.publishにオブジェクトの空でない配列を取得するコードが必要です。Meteor Publishは空でない配列を取得します

サンプル構造を以下に示します(ここでは、フィールド名は任意であり、私はちょうど構造を提示しています) - あなたは私が空の配列を持つ1「火曜」を持っている参照してください。この例では

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:[], 
     } 
     }  
    ] 
} 

(見終わり)。私は空ではないすべての「チャプターズ・トゥ」を取りに行きたいです。 私は、ドキュメント全体(この例では 'pages.id'、 'pages.name'、 'pages.picture')とそれらの配列の 'chapters.tue'からのすべてのフィールドを望んでいないことに注意してください( 'chapters.tue ')は空ではありません。 チャプターは常に毎週の曜日に配列されていることが保証されていますが、これらの配列自体には要素がある場合とない場合があります。これらの配列が移入されると、構造は常に同じになります(上記の例では常にchapter1があり、配列にはchapter2が常にあります)。

ありがとうございました。

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

は、これまでのところ、私はこれだ を、私は1つがMongoDBの集計から反応を取得するために使用できるパッケージ「反応性骨材」になっています。 しかし、集計はかなり複雑になっていたので私には適していませんでした。私が思った何かのための二重投影と二重のグループ分けは単純でなければならない。私はこの構造が私には意味をなさないので、私のコレクションを小さなコレクションに分解したくなかった(ブックはページがあり、各ページにはチャプターがあり、この場合、チャプターは曜日に広がっている)。このコレクションを複数のコレクションに分割して、グループ化できるようにするには、SQL Serverに戻ってきてください。

私は、私が必要とするフィールドの投影でコレクション上で 'find'を使ってしまいました。問題は 'find'がドキュメントレベルで動作するため、まだ空の配列を取得することです。私はこのサブスクリプションをクライアントのみのコレクションに公開するために 'publish-composite'というMeteorパッケージを使用しました(同じ 'books'コレクションのアプリケーションにある他のサブスクリプションとの結合で終わらないように)。私はクライアント上でフィルタリングを行います(つまり、どの配列が空であり、読み込まれた配列のみを表示するのかをクライアント上で検出します)。

この機能を実現するための単純な集約パイプラインを知っている人は、まだ覚えています。

+0

MeteorでMongoアグリゲーションを公開することはできません。Meteorメソッド – Khang

+0

はどのような提案ですか?次にMeteor Publishで上記を達成するにはどうすればよいですか? – RichardAu

+0

私はあなたのコレクションをデカップリングする必要があると思います、3つの別々のコレクションを作成する: 'myDoc'、' pages'、 'bags' – Khang

0

ここに私がやってしまった解決策がある - -

関連する問題