我阅读了MongoDB中的数据模型,并来到了one to many relationship:
在下面的示例中,是否表示book-documents应该在集合books
中,MongoDB会以某种方式将文档与匹配数组books
的id链接到publisher
?或者链接仅存在于架构师的头脑中?
{
name: "O'Reilly Media",
founded: 1980,
location: "CA",
books: [12346789, 234567890, ...]
}
{
_id: 123456789,
title: "MongoDB: The Definitive Guide",
author: [ "Kristina Chodorow", "Mike Dirolf" ],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English"
}
{
_id: 234567890,
title: "50 Tips and Tricks for MongoDB Developer",
author: "Kristina Chodorow",
published_date: ISODate("2011-05-06"),
pages: 68,
language: "English"
}
答案 0 :(得分:2)
MongoDB 不会以某种方式将与ids
匹配的数组书籍的文档链接到publisher
。所以是的链接只存在于架构师的头脑中
本文只是试图解释如何在MongoDB中的文档之间建立一对多的关系。
MongoDB中的 One to many
关系也被进一步分类为one to few
和one to squillions
。如果方案是one to few
,可以使用这样的方法:
{
name: "O'Reilly Media",
founded: 1980,
location: "CA",
books: [12346789, 234567890, ...]
} {
_id: 123456789,
title: "MongoDB: The Definitive Guide",
author: ["Kristina Chodorow", "Mike Dirolf"],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English"
} {
_id: 234567890,
title: "50 Tips and Tricks for MongoDB Developer",
author: "Kristina Chodorow",
published_date: ISODate("2011-05-06"),
pages: 68,
language: "English"
}
但实际上,出版商可能会出版数百万本书。因此,在这种情况下,它将成为一个广泛的例子。现在存储数百万book_ids
可能会使MongoDB文档的大小超过16MB,这限制了MongoDB文档的大小。因此,在这种情况下,最好使用这种方法:
{
_id: "oreilly",
name: "O'Reilly Media",
founded: 1980,
location: "CA"
} {
_id: 123456789,
title: "MongoDB: The Definitive Guide",
author: ["Kristina Chodorow", "Mike Dirolf"],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English",
publisher_id: "oreilly"
} {
_id: 234567890,
title: "50 Tips and Tricks for MongoDB Developer",
author: "Kristina Chodorow",
published_date: ISODate("2011-05-06"),
pages: 68,
language: "English",
publisher_id: "oreilly"
}
答案 1 :(得分:2)
这些在MongoDB documentation中称为手动引用,是关系的首选方法。还有DBRef,但正如文档所述,你应该使用手动引用:
在大多数情况下,您应该使用手动参考方法 连接两个或多个相关文件。但是,如果你需要 来自多个集合的引用文档,请考虑使用DBRefs。
这两种方法都没有真正链接数据库级别的任何内容。
答案 2 :(得分:1)
在MongoDB本身,据我所知,这是不可能的,但是在MongooseJS中,MongoDB的javascript包装器可以通过保存对publisher.books数组中book._id的引用来实现。
var publisherSchema = Schema({
_id : Number,
name : String,
founded : Number,
books : [{ type: Schema.Types.ObjectId, ref: 'Book' }]
});
var bookSchema = Schema({
_id : Number,
title : String,
author : [{type: String}],
pages: Number,
language: String
});
var Book = mongoose.model('Book', bookSchema);
var Publisher = mongoose.model('Publisher', publisherSchema);
查询数据时,可以使用populate方法。
Publisher.
find().
populate('books')