了解MongoDB引用

时间:2016-04-06 17:41:11

标签: mongodb

我阅读了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"
}

3 个答案:

答案 0 :(得分:2)

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"
}

但实际上,出版商可能会出版数百万本书。因此,在这种情况下,它将成为一个广泛的例子。现在存储数百万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')