2015-05-29 4 views
0

У меня есть следующий пример набора данных:Метеор Blaze шаблон не показывает отфильтрованный MongoDB встроенной коллекции

SampleCol.insert({ 
    Name: "John Doe", 
    Description: "Nice Guy", 
    Embedded_1: [{ 
     key1: 'x1', 
     key2: 'x2', 
     TariffTypes: [{ 
      TariffCode: 'Promocional', 
      Price: 125, 
      Weekdays: ['Sun', 'Sat']    
     }, 
     { 
      TariffCode: 'LastMinute', 
      Price: 150, 
      Weekdays: ['Sun', 'Sat'] 
     }], 
     }, 
     { 
     key1: 'x3', 
     key2: 'x4', 
      TariffTypes: [{ 
       TariffCode: 'Promocional', 
       Price: 175, 
       Weekdays: ['Sun', 'Sat']   
      }, 
      { 
       TariffCode: 'LastMinute', 
       Price: 200, 
       Weekdays: ['Sun', 'Sat'] 
      }] 
     }] 
    }); 

Я пытаюсь фильтровать и показать на моем шаблоне только Embedded_1 с ключ1 = «x1». Вот шаблон:

<template name="test2"> 
    {{#each items}} 
    {{# each Embedded_1}} 
     {{this.key1}} 
    {{/each}} 
    {{/each}} 
    </template> 

Я попытался следующие и вспомогательные шаблона версии:

Version 1 возвращается как x1 и x3:

Template.test2.helpers({ 
    items: function() { 
    collection = SampleCol.find({'Embedded_1.key1': 'x1'}); 
    return collection; 
    } 
}); 

Это также возвращает все результаты:

 collection = SampleCol.find({Embedded_1: {$elemMatch: { key1: 'x1'}}}); 

Выход в обоих случаях: x1x3

Он должен показывать только x1.

Где ошибка?

EDIT: Я следовал рекомендациям Марка Лейбера и BraveKenny, и они помогают решить выход Mongodb. Я могу получить на Mogo скорбь желаемый результат с помощью следующей команды:

db.SampleCol.find({},{_id:0, Embedded_1: {$elemMatch: {key1:"x1"}}}) 

Это решает часть Монго. Однако, я думаю, эта проблема также связана с тем, КАК этот результат взаимодействует с шаблоном Meteor Blaze. Шаблон «test2» продолжает показывать всю коллекцию, а не только что мы просто фильтровали.

Есть ли намеки на это?

EDIT # 2 Это действительно проблема шаблон Blaze. Код Mongo find() выше правильно возвращает только результаты key = 'x1. Он даже удаляет родительский документ и данные, такие как название и описание:

{ 
    Embedded_1: [{ 
     key1: 'x1', 
     key2: 'x2', 
     TariffTypes: [{ 
      TariffCode: 'Promocional', 
      Price: 125, 
      Weekdays: ['Sun', 'Sat']    
     }, 
     { 
      TariffCode: 'LastMinute', 
      Price: 150, 
      Weekdays: ['Sun', 'Sat'] 
     }], 
     }; 

Однако шаблон показывает только любой результат, если написано, как показано ниже, в том числе {{пунктов #each}} {{/}} каждой line

<template name="test2"> 
    {{#each items}} 
    {{Name}} <br> 
    {{Description}}<br> 
    {{#each Embedded_1}} 
     {{this.key1}} <br> 
     {{#each TariffTypes}} 
      {{this.Price}} <br> 
     {{/each}} 
    {{/each}} 
{{/each}} 
</template> 

Несмотря на то, что помощник шаблона не возвращается Имя и описание, оно отображает их в браузере вместе. Он показывает, как это:

John Doe 
Nice Guy 
x1 
125 
150 
x3 
175 
200 

Я имею тестер вынимая {{#each пункты}} или {{#each Embedded_1}} и ни работал.

Как должен быть написан шаблон Blaze?

+0

[Интересно читать] (http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object -array-in-mongodb-collection) – SylvainB

+0

Возможный дубликат [MongoDB - Фильтрация содержимого внутреннего массива в наборе результатов] (http: // stackoverflow.com/questions/4701427/mongodb-filtering-the-content-of-the-internal-array-in-a-resultset) –

+0

Вы просто находите любой документ, соответствующий вашим критериям, поэтому ваш документ будет возвращен. Вам нужно отфильтровать возвращаемое содержимое. См. Дублируемую ссылку, которую я опубликовал. –

ответ

0

Это должен возвращать только внедренный документ:

SampleCol.find({Embedded_1: {$elemMatch:{key1:'x3'}}}, {fields: {Embedded_1: true}}) 
+0

Спасибо за поддержку Adnan Y, но я получаю это на Mono Shell: error: { \t «$ err»: «Canonicalize query: BadValue Неподдерживаемая опция проекции: поля: {Embedded_1: true}», \t «код»: 17287 } и получить его в браузере: [Объект объекта] – Juliomac

+0

Это было для Метеор. Для Mongo проекционная операция немного отличается. 'db.somecollection.find ({Embedded_1: {$ elemMatch: {key1: 'x3'}}}, {Embedded_1: true})' должен работать в консоли mongo. –

+0

Ну, я написал db.somecollection.find ... на Mogno Shell, конечно. Это сообщение было результатом этого. Если бы я сделал это, как в вашем первом примере, сообщение об ошибке было бы «SampleCol не определено». но проблема кажется другой. Речь идет о том, как шаблоны на Blaze взаимодействуют с Mongo find(). Смотрите мои изменения в моих новых выводах. – Juliomac

Смежные вопросы