我对meteor.js很新,并尝试用它构建一个应用程序。这次我想在MEAN堆栈上尝试一下,但此时我很难理解如何在服务器端加入两个集合......
我想要像mongodb populate
这样的非常相同的行为来获取内部文档的一些属性。
让我告诉你我的收藏品是这样的
{
name: 'Name',
lastName: 'LastName',
anotherObject: '_id of another object'
}
另一个对象有一些字段
{
neededField1: 'asd',
neededField2: 'zxc',
notNeededField: 'qwe'
}
因此,每当我进行REST调用以检索我想要的第一个对象时,它只包含内部对象的 neededFields ,所以我需要在后端加入它们,但我找不到合适的方法来执行它。 / p>
到目前为止,在搜索时我看到这里的一些包是列表
答案 0 :(得分:1)
你会发现reywood:publish-composite对于“加入”相关集合很有用,即使类似SQL的连接在Mongo和Meteor中并不实用。您最终得到的是每个集合中的相应文档和字段。
使用 myCollection 和 otherCollection 作为两个集合的假名:
Meteor.publishComposite('pseudoJoin', {
find: function() {
return myCollection.find();
},
children: [
{
find: function(doc) {
return otherCollection.find(
{ _id: post.anotherObject },
{ fields: { neededField1: 1, neededField2: 1 } });
}
}
]
});
请注意, otherCollection 的_id
字段会自动包含在内,即使它不在字段列表中。
根据评论进行更新
由于您只想将数据返回到REST调用,因此您不必担心游标或反应性。
var myArray = myCollection.find().fetch();
var myOtherObject = {};
var joinedArray = myArray.map(function(el){
myOtherObject = otherCollection.findOne({ _id: el.anotherObject });
return {
_id: el._id,
name: el.name,
lastName: el.lastName,
neededField1: myOtherObject.neededField1,
neededField2: myOtherObject.neededField2
}
});
console.log(joinedArray); // These should be the droids you're looking for
这是基于1:1的关系。如果有许多相关对象,则必须将父对象重复为子项数。