我正在使用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();
}
)
答案 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中的情况,在一对多关系中,引用位于“一”部分。反之亦然,书籍不一定是出版商的财产。这里的线索是没有“必须”。
这完全取决于“多对多”的数量。在这种情况下,我要说的还有我们谈论的图书馆类型,目录大小以及新书购买是否常见:
旁注
虽然与问题无关,但我认为您的文档结构存在缺陷。 _id
和book_id
是多余的。如果你想遵循增量整数ID的RDBMS模式,那么在插入1,2,3等文档时你可以指定自己的_id
,这是绝对可以的.ObjectID()是一件好事但是,再一次,没有义务使用它。