我读了MongoDB中的数据模型,并得出了一对多的关系:
在下面的示例中,这是否意味着书籍文档应该在集合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"
}
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"
}
但实际上,出版商可以出版数百万本书。因此,在这种情况下,它将是一个到squillions的例子。现在存储数百万个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"
}
这些在MongoDB文档中称为手动引用,并且是关系的首选方法。还有 DBRef,但正如文档所述,您应该使用手动引用:
在大多数情况下,您应该使用手动参考方法 连接两个或多个相关文档。但是,如果您需要 引用来自多个集合的文档,请考虑使用 DBRefs。
这两种方法都没有真正链接数据库级别中的任何内容。
在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);
查询数据时,可以使用 popurate 方法。
Publisher.
find().
populate('books')