了解MongoDB引用



我读了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 fewone 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')

最新更新