【问题标题】:Joining two collection in MongoDB using Meteor JS使用 Meteor JS 在 MongoDB 中加入两个集合
【发布时间】:2018-03-11 22:08:57
【问题描述】:

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

我希望结果将包含“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'
    }
  });
 });

我在这里做错了什么? 谢谢!

【问题讨论】:

  • 你能显示你的出版代码吗?这就是连接应该发生的地方
  • 您好 Fred,我刚刚添加了发布代码。我会很感激你的回答。谢谢!

标签: mongodb reactjs meteor


【解决方案1】:

另一种处理方式(也是我在多个应用程序中使用的一种方式)是使用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 中向客户端发送连接数据的非常简单的方法,而且效果非常好。

如果您愿意,您可以发布更多属于诗歌的子文档。

希望对你有帮助

【讨论】:

  • 这是一个很好的解决方案,但要小心,因为有很多记录它会变得非常慢。单独发布或汇总它们可能会更快。请务必在 poem.belongsTo 字段上添加索引。
  • 谢谢肖恩,我会去看看。我有点怀疑“这个包非常适合发布少量相关文档。如果您将它用于包含许多子出版物的大型文档集,您可能会遇到性能问题。”但我不确定什么是大的和小的。必须测试它。这是比使用 $lookup 更好的加入方式吗?
  • 我没有使用 $lookup 所以我不确定哪个更好。我还没有深入研究源代码以查看发布复合包是否是这样工作的。根据我的经验,发布复合包可以发送 100 个链接文档
  • Hei Sean,我试图让它工作,但没有成功。我做了一个新的案例,对收藏有更多的描述。请您看一下这里:stackoverflow.com/questions/49306048/… 谢谢! :)
猜你喜欢
  • 2015-10-07
  • 2018-08-24
  • 2012-09-15
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2020-09-03
相关资源
最近更新 更多