2017-07-25 9 views
0

私はMongoDBを初めて使用しており、クエリされたデータを表に表示するために流星テンプレートを使用したいと考えています。Meteor/MongoDB - オブジェクト配列から単一の要素を取得してテーブルに表示する方法は?

最初の文書:

{ 
    "_id" : "A-89273498720", 
    "myItems" : [ 
     { 
      "itemId" : "item_1", 
      "username" : "Homer", 
      "purpose" : "justBecause", 
     }, 
     { 
      "itemId" : "item_2", 
      "username" : "March", 
      "purpose" : "justBecause2", 

     }, 
     { 
      "itemId" : "item_3", 
      "username" : "Maggie", 
      "purpose" : "justBecause3", 

     } 
    ] 
} 

第2の文書:

私はこのような構造で "infoData" という名前のコレクションを持っている

{ 
    "_id" : "B-564548461117", 
    "myItems" : [ 
     { 
      "itemId" : "item_4", 
      "username" : "Lisa", 
      "purpose" : "justBecause4", 

     }, 
     { 
      "itemId" : "item_5", 
      "username" : "Lisa", 
      "purpose" : "justBecause5", 

     }, 
     { 
      "itemId" : "item_6", 
      "username" : "Bart", 
      "purpose" : "justBecause5", 

     } 
    ] 
} 

今、私は同様に "のitemId" を取得する必要があります"username"と "purpose"として "itemId"をクエリ演算子として使用します。 「itemId」はユニークです。私の最初の問題は、データを取得することです。これはときので、私は必要な結果である場合

infoData.findOne(
    { 
     'myItems.itemId': "item_2" 
    }, 
    { 
     '_id': 0, 'myItems': {$elemMatch: {'itemId': "item_2"}} 
    }) 

私はわからないよと同じ結果を得る

infoData.findOne({"myItems.itemId": "item_2"}, {_id: 0, 'myItems.$': 1}) 

:たとえば、私はシングル「のitemId」フィールド「item_2」を取得するには、これを試してみましたこのクエリをJSON.stringify()に入れて、コンソールのデータを確認しました。 "item_2"フィールドと "itemId"フィールドのデータ "item_2"だけでなく、docの配列内のすべてのフィールドとオブジェクトが表示されます。後でテーブル内で反復処理できるように、クエリのitemId、userName、およびpurpose(item_2を含むオブジェクトのみ)のすべてのフィールドを取得する可能性もあります。

第2の問題は、データを表に表示する必要があることです。

だから私はこのヘルパーを書いた:

'itemInfoDisplay': function() { 
    if (Meteor.userId()) { 
     var itemInfos= infoData.findOne(
      {"myItems.itemId": "item_2"}, {_id: 0, 'myItems.$': 1}); 
     return itemInfos 
    } 
} 

、テーブル内のデータを表示したい:

{{#each itemInfoDisplay}} 
    {{#each myItems}} 
     <tr> 
      <td><h4>{{ itemId }}</h4></td> 
     </tr> 
    {{/each}} 
{{/each}} 

私はそこにコードと間違って何かがあり、またHTMLテンプレートを知っています。私は、mongoDBクエリの結果は配列ではないと思いますか?それを1つにすることは可能ですか?使用しているmongoクエリは、私のニーズに合った正しいソリューションですか?

最後に、特定の「itemId」に割り当てられたすべてのデータを取得してテーブルに表示するだけで済みます。私は何か助けていただければ幸いです。

答えて

1

私はこれを行うには2つの方法が考えられます。最初は、この投稿に記載されているように投影を使用することです:Retrieve only the queried element in an object array in MongoDB collection

しかし、あなたはその$ elemMatch形式を使用しているようです。動作していない場合は、findOne()ではなくfind()を試してみるかどうかはわかりません。 Meteorがmongodbにクエリを送信する方法に違いがあるかもしれません。

これでうまくいかない場合、2番目の方法はちょっとしたハックですが、うまくいくでしょう。 findOne(findと違って)はクライアント上で同期しているという事実を利用しています。レコードを取得してから、手動でforEachを実行して、適切な配列要素を取得し、その配列を返すだけです。理想的な方法は、クエリ・レベルでデータを制限することです

return(_.filter(itemInfos.myItems, {itemId: "item_2"})); 

ますが、その場合:

var itemInfos= infoData.findOne({"myItems.itemId": "item_2"}, {_id: 0, 'myItems.$': 1}); 
var items = []; 

itemInfos.myItems.forEach(function(myItem) { 
    if (myItem.itemId == "item_2") { 
    items.push(myItem); 
    }; 
}); 

return items; 

あなたがlodashを使用する場合は、foreachループをスキップして、フィルタを使用することができます。このような何かオプション2は動作しません。

+0

多くのおかげで、私はそれが少なくとも何とかテーブルにデータを表示するために来るまでは動作すると思います。あなたの最初と2番目のソリューションは何かを返します。これでテーブルの '[object Object]'は見ることができますが、それでも実際の値は表示されません。テンプレートを書き直す必要がありますか、または何らかの方法で取得したデータのタイプを変更する必要がありますか? – Jaybruh

+0

編集:テンプレートを{{itemInfosDisplay}}に変更しましたが、{[#each}}はありません。その場合は '[object Object]'のみが返されるためです。元のテンプレートでは、表には何も表示されません。 – Jaybruh

+1

{{#each myItems}}を削除するだけです。したがって、あなたのテンプレートは次のようになります: {{#e item itemInfosDisplay}} {{itemId}} {{/ each}} 新しいヘルパーがmyItemsの配列を直接返していることを覚えておいてください。[{itemId:XXX、username: XXX、目的:XXX}、{itemId:YYY、ユーザー名:YYY、目的:YYY})。返される配列にmyItemsプロパティはありません。返された正確なデータ構造を表示したい場合はconsole.log(items)を使用し、それに基づいてブレーズテンプレートを作成することができます。 – Hashcut

関連する問題