使用Meteor JS连接MongoDB中的两个集合

使用Meteor JS连接MongoDB中的两个集合,mongodb,reactjs,meteor,Mongodb,Reactjs,Meteor,我试图把两个藏品联系起来:书和诗。一本书可以有一些诗。我只需要一本书,里面有所有相关的诗 我希望结果将有“poems\u join”字段,其中包含已加入的集合,但“poems\u join”不存在。没有显示错误 export default withTracker(props => { const bookSubscription = Meteor.subscribe('mybooks'); return { editedBook: Books.findOn

我试图把两个藏品联系起来:书和诗。一本书可以有一些诗。我只需要一本书,里面有所有相关的诗

我希望结果将有“poems\u join”字段,其中包含已加入的集合,但“poems\u join”不存在。没有显示错误

export default withTracker(props => {
    const bookSubscription = Meteor.subscribe('mybooks');
    return {
        editedBook: Books.findOne({ _id: props.editBookId },
        {
          $lookup:
            {
              from: 'poems',
              localField: 'poems.id',
              foreignField: '_id',
              as: 'poems_join'
            }
        }
    ),
    bookLoaded: bookSubscription.ready()
};
})(BookEditor);
出版物代码如下:

Meteor.publish('mybooks', function (bookId) {
   return Books.find({ userId: this.userId, _id: bookId },
   {
    $lookup:
    {
      from: 'poems',
      localField: 'poems.id',
      foreignField: '_id',
      as: 'poems_join'
    }
  });
 });
我错在哪里了?
谢谢

处理这个问题的另一种方法(也是我在多个应用程序中使用的一种方法)是使用包

要使用它,您只需在诗歌文档中存储对该诗歌所属书籍的引用

例如:

const poem = {
    title: 'A great poem',
    author: 'William Blake',
    belongsTo: 'R84dizM7dnhPbrFX8',
}
然后,您只需创建以下复合发布:

import { publishComposite } from 'meteor/reywood:publish-composite';
import Books from '../books.js';
import Poems from '../poems.js';

publishComposite('bookAndAllPoems', function(bookId) {
    return {
        find() {
            return Books.find({ _id: bookId });
        },
        children: [
            {
                find(book) {
                    return Poems.find({ belongsTo: book._id });
                },
            }
        ]
    }
});
这是一种非常简单的方法,可以在Meteor中将加入的数据发送到客户端,效果非常好

如果你愿意,你可以公开更多属于诗歌的儿童文件


希望这有帮助

您能显示您的出版物代码吗?这就是连接应该发生的地方Hi Fred,我刚刚添加了发布代码。如果你能回答,我将不胜感激。谢谢这是一个很好的解决方案,但要小心,因为它可能会变得非常慢,有很多记录。单独发布或聚合可能会更快。一定要在
诗.belongsTo
字段中添加索引。谢谢肖恩,我会查出来的。我有点怀疑“这个软件包对于发布小型相关文档非常有用。如果您将它用于包含许多子出版物的大型文档集,您可能会遇到性能问题。”但我不确定什么是大型和小型。我必须测试一下。这是一种比使用$lookup更好的加入方式吗?我没有使用$lookup,所以我不确定哪个更好。我还没有深入研究源代码,看看publish复合包是否就是这样工作的。根据我的经验,publish composite软件包可以发送100个链接文档Shei Sean,我试图让它工作,但没有成功。我做了一个新的案例,更多地描述了收藏品。你能看看这个吗:谢谢!:)