我正在尝试连接两个集合:书籍和诗歌。一本书可以有一些诗。我必须得到一本包含所有相关诗歌的书。
我希望结果会有“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'
}
});
});
这里有什么问题? 谢谢!
答案 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中将联接数据发送到客户端的一种非常简单的方法,并且效果非常好。
如果您愿意,您可以发布更多属于诗歌的儿童文件。
希望这有帮助