我有以下数据结构:
收藏书籍:
{
_id: "ajafsoaifj3341",
title: "Hello World",
poems: [
{
id: "12fjenofnoi23",
addedAt: "2018-03-12...."
},
{
id: "563jdfb34jfrr",
addedAt: "2018-03-10...."
},
{
id: "78a1ewqeqweq",
addedAt: "2018-03-08...."
}
]
}
收集诗:
{
_id: "563jdfb34jfrr",
title: "How to Join",
author: "Smith"
addedAt: "2017-12-21..."
}
我需要加入这两个集合才能获得这首诗的标题。类似的东西:
{
_id: "ajafsoaifj3341",
title: "Hello World",
poems: {
id: "12fjenofnoi23",
addedAt: "2018-03-12....",
title: "How to Join"
}
}
我喜欢这样的例子:
//SERVER
import { Poems } from '../imports/collections/poems';
import { Books } from '../imports/collections/books';
Meteor.publish('booksWithPoems', function (bookId) {
const book = Books.findOne({ _id: bookId });
return [
Books.find({ _id: bookId }),
Poems.find({
_id: {
$in: book.poems.id
}
})
];
});
//CLIENT
export default withTracker(props => {
const bookSubscription = Meteor.subscribe('booksWithPoems', props.editBookId);
return {
editedBook: Books.findOne({}),
editedPoems: Poems.find({}).fetch(),
bookLoaded: bookSubscription.ready()
};
})(connect(mapStateToProps, {
...
})(withRouter(BookEditor)));
但是this.props.editedPoems是未定义的。这有什么不对?
也许这是更好的方法。如果你能用服务器和客户端代码帮助我,我将不胜感激。我是Meteor / Mongo世界的新人。
最后的评论。我不需要诗歌文件中的所有数据,只需要“标题”。谢谢!
答案 0 :(得分:1)
您的出版物有以下有问题的部分:$in
表示数组,而book.poems.id
是单首诗上的字符串值。你想要的是book.poems
中所有id的数组。
这也是原因,而其他订阅(editedBook
)收到一些数据而editedPoems
没有。订阅仅反映在上次执行发布方法时发现的那些文档。
为了更正确,您需要先map
诗歌ID并将此数组设置为$in
的值:
Meteor.publish('booksWithPoems', function (bookId) {
const book = Books.findOne({ _id: bookId });
return [
Books.find({ _id: bookId }),
Poems.find({
_id: {
$in: book.poems.map( p => p.id ), // ["12fjenofnoi23","563jdfb34jfrr","78a1ewqeqweq"]
}
})
];
});
现在它应该选择所有诗歌,其id适合数组中提供的ID之一,分配给$in
。
我没有检查客户端代码和加入数据的方式,但我认为这个mongo查询选择器是这里的主要问题。
更多内容请阅读$ in:https://docs.mongodb.com/manual/reference/operator/query/in/