使用Meteor JS在MongoDB中创建两个集合的连接

时间:2018-03-15 17:46:11

标签: mongodb join meteor collections

我有以下数据结构:

收藏书籍:

{
  _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世界的新人。

最后的评论。我不需要诗歌文件中的所有数据,只需要“标题”。谢谢!

1 个答案:

答案 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/