MongoDB中2个集合之间的关系以及它们之间的数据显示

时间:2015-12-03 16:23:40

标签: mongodb nosql

我正在使用MongoDB为库创建一个小型数据库。我有2个收藏品,第一个被称为'书籍'它存储有关书籍的信息。第二个系列被称为“出版商”。它存储有关发布者的信息以及他们发布的图书的ID。

这是' books'的文档结构。它有3个文件

{
    "_id" : ObjectId("565f2481104871a4a235ba00"),
    "book_id" : 1,
    "book_name" : "C++",
    "book_detail" : "This is details"
},

{
    "_id" : ObjectId("565f2492104871a4a235ba01"),
    "book_id" : 2,
    "book_name" : "JAVA",
    "book_detail" : "This is details"
},
{
    "_id" : ObjectId("565f24b0104871a4a235ba02"),
    "book_id" : 3,
    "book_name" : "PHP",
    "book_detail" : "This is details"
}

这是'发布商的文档结构。它有1个文件。

{
    "_id" : ObjectId("565f2411104871a4a235b9ff"),
    "pub_id" : 2,
    "pub_name" : "Publisher 2",
    "pub_details" : "This is publishers details",
    "book_id" : [2,3]
}

我想编写一个查询,以显示此发布者发布的图书的所有详细信息。我写了这个查询,但它不起作用。当我运行它时,它显示此消息"脚本成功执行,但没有结果显示。"。

db.getCollection('publishers').find({"pub_id" : 2}).forEach(
      function (functionName) {
      functionName.books = db.books.find( { "book_id": functionName.book_id } ).toArray();
      } 
)

3 个答案:

答案 0 :(得分:1)

试试这种方式,

UniqueId

答案 1 :(得分:0)

我认为您的数据结构存在缺陷。出版商是一本书的财产,而不是相反。您应该为每本书添加pub_id,然后从发布商处删除book_id

{
    "_id" : ObjectId("565f2481104871a4a235ba00"),
    "book_id" : 1,
    "book_name" : "C++",
    "book_detail" : "This is details",
    "pub_id" : 1
},
{
    "_id" : ObjectId("565f2492104871a4a235ba01"),
    "book_id" : 2,
    "book_name" : "JAVA",
    "book_detail" : "This is details"
    "pub_id" : 2
},
{
    "_id" : ObjectId("565f24b0104871a4a235ba02"),
    "book_id" : 3,
    "book_name" : "PHP",
    "book_detail" : "This is details"
    "pub_id" : 2
}

然后,选择你喜欢的书:

db.getCollection('books').find({"pub_id" : 2});

答案 2 :(得分:0)

我建议您阅读官方文档,因为图书与发布商之间的关系正是在那里使用的示例:https://docs.mongodb.org/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

在mongoDB和noSQL中,publisher必须是book的属性。这只是RDBMS中的情况,在一对多关系中,引用位于“一”部分。反之亦然,书籍不一定是出版商的财产。这里的线索是没有“必须”。

这完全取决于“多对多”的数量。在这种情况下,我要说的还有我们谈论的图书馆类型,目录大小以及新书购买是否常见:

  • 每个发布商的图书数量是否很少以及有关发布商的数据通常是通过有关图书的数据来访问的?然后,将发布商信息嵌入图书文档中。
  • 每个出版商的图书数量是否相当大但相当稳定(例如:收购很少的历史图书馆)?然后,创建一个发布商集合,其中包含每个发布者的一系列图书。
  • 每个发布商的图书数量是否相当大,目录是否以合理的速度增长?然后,在书籍文档中包含参考,并用它获取发布者信息。

旁注

虽然与问题无关,但我认为您的文档结构存在缺陷。 _idbook_id是多余的。如果你想遵循增量整数ID的RDBMS模式,那么在插入1,2,3等文档时你可以指定自己的_id,这是绝对可以的.ObjectID()是一件好事但是,再一次,没有义务使用它。