使用Meteor JS在MongoDB中加入两个集合

时间:2018-03-11 22:08:58

标签: mongodb reactjs meteor

我正在尝试连接两个集合:书籍和诗歌。一本书可以有一些诗。我必须得到一本包含所有相关诗歌的书。

我希望结果会有“poems_join”字段,其中包含已加入的集合,但“poems_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'
    }
  });
 });

这里有什么问题? 谢谢!

1 个答案:

答案 0 :(得分:2)

另一种处理此问题的方法(以及我在多个应用程序中使用的方法)是使用composite publications包。

要使用它,您需要做的就是在诗文档中存储诗所属的书的引用。

示例:

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中将联接数据发送到客户端的一种非常简单的方法,并且效果非常好。

如果您愿意,您可以发布更多属于诗歌的儿童文件。

希望这有帮助