2017-02-09 5 views
0

У меня есть 2 коллекции.Метеор, запрос Коллекции на основе идентификаторов, полученных из другой коллекции

ItemList = new Mongo.Collection('items'); 
BorrowerDetails = new Mongo.Collection('borrow'); 

ItemList.insert({ 
    brand: "brand-Name", 
    type: "brand-Type", 
    ._id: id 
}); 

BorrowerDetails.insert({ 
    key: "ItemList.id", //equals to .id of the ItemList Collection 
    name : "borrowerName" 
}); 

Вопрос!
Как я могу получить записи из коллекции BorrowerDetails на основе определенного типа из коллекции ItemList.

ex. Извлеките все записи из коллекции BorrowerDetails, где ключ равен id записи в коллекции ItemList, тип которой равен «Desktop».

return BorrowerDetails.find(
    { key : 
     ItemList.find(
      { type : 'Desktop' }, 
      { fields: {'_id':1 } } 
     ) 
    } 
); //error! 
+0

Когда вы используете базу данных NOSQL, вы не должны думать, чтобы присоединиться. Вместо этого вы выбираете его 2 раза. – Rudy

+0

Сэр Можете ли вы объяснить кратко? :) – Vynterest

+0

ok дайте мне минуту ... – Rudy

ответ

0

Обратите внимание, что я не имею nodejs прямо сейчас в моем ноутбуке, так что, возможно, есть несколько ошибок, так как я не в состоянии проверить это.

Сначала создайте файл публикации (например, server \ publications \ loanPub.js). внутри файла вы должны создать метод публикации. Логика здесь проста, получить массив Itemid первый, а затем передать его в качестве параметра в Mongo select $in.

Meteor.publish('queryBorrowerTypeDesktop', function(criteria) 
{ 

    var itemArr = ItemList.find({ type : 'Desktop' }, 
          { fields: {'_id':1 } }); 
    if(itemArr){ 
    //itemArr found, so do a select in using the array of item id we retrieved earlier 
    var borrowers = BorrowerDetails.find({ key: { $in: itemArr } }); 
    return borrowers; 
    }else{ 
    //found nothing- so return nothing 
    return [] 
    } 
}); 

Во-вторых, в маршрутизаторе:

Router.route('/test', { 
    name: 'test', 
action: function() 
{ 
    //change accordingly. 
}, 
waitOn: function() 
{//subscribe from publisher that we just created... 
    return [ 
    Meteor.subscribe('queryBorrowerTypeDesktop') 
    ]; 
}, 
data: function() { 
if(Meteor.userId()) 
{ 
    // also include the sorting and limit so your page will not crash. change accordingly. 
    return { 
     borrowerDetails: BorrowerDetails.find({},{sort: {name: -1},  limit: 30}), 
    } 
    } 
} 
}); 

Обратите внимание, что в данных, BorrowerDetails.find() не нужно фильтровать ничем, потому что он был отфильтрован во время подписки, которая была кеширована в MiniMongo в вашем браузере.

+0

Сэр Что такое qty в var заемщиках = BorrowerDetails.find ({qty: {$ in: itemArr}}) – Vynterest

+0

Должен быть «ключ». Я обновил свой ответ. – Rudy