使用Meteor JS连接MongoDB中的两个集合
我试图把两个藏品联系起来:书和诗。一本书可以有一些诗。我只需要一本书,里面有所有相关的诗 我希望结果将有“poems\u join”字段,其中包含已加入的集合,但“poems\u join”不存在。没有显示错误使用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
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,我试图让它工作,但没有成功。我做了一个新的案例,更多地描述了收藏品。你能看看这个吗:谢谢!:)