Meteorjs - 在后端加入集合的正确方法是什么

时间:2015-11-17 08:09:49

标签: mongodb meteor

我对meteor.js很新,并尝试用它构建一个应用程序。这次我想在MEAN堆栈上尝试一下,但此时我很难理解如何在服务器端加入两个集合......

我想要像mongodb populate这样的非常相同的行为来获取内部文档的一些属性。

让我告诉你我的收藏品是这样的

{
  name: 'Name',
  lastName: 'LastName',
  anotherObject: '_id of another object'
}

另一个对象有一些字段

{
  neededField1: 'asd',
  neededField2: 'zxc',
  notNeededField: 'qwe'
}

因此,每当我进行REST调用以检索我想要的第一个对象时,它只包含内部对象的 neededFields ,所以我需要在后端加入它们,但我找不到合适的方法来执行它。 / p>

到目前为止,在搜索时我看到这里的一些包是列表

  1. Meteor Collections Helper
  2. Publish with Relations
  3. Reactive joins in Meteor (article)
  4. Joins in Meteor.js (article)
  5. Meteor Publish Composite

1 个答案:

答案 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的关系。如果有许多相关对象,则必须将父对象重复为子项数。