假设我们有三个集合,
publications
authors
books
现在,这些是关系:
publications
有很多authors
authors
有很多books
books
有一个author
现在,当我们将mongoose库用于node.js时,我们可以使用schema definition中的ref
键来定义关系。例如:
对于publications
:
const mongoose = require('mongoose')
const Schema = mongoose.Schema
var publicationSchema = new Schema({
name: String,
authors: [{
type: Schema.Types.Objectid,
ref: 'Author'
}]
})
var Publication = mongoose.model('Publication', publicationSchema)
对于authors
:
var authorSchema = new Schema({
name: String,
books: [{
type: Schema.Types.Objectid,
ref: 'Book'
}]
})
var Author = mongoose.model('Author', authorSchema)
对于books
:
var bookSchema = new Schema({
title: String,
category: String,
author: {
type: Schema.Types.ObjectId,
ref: 'Author'
}
})
var Book = mongoose.model('Book', bookSchema)
现在,假设我们有一本带有特定_id
的 book 。我们可以使用猫鼬的.populate()
方法获取书的详细信息及其 author 。例如
Book.findOne({_id: '5d36fxxxxxxxxxxx0a'})
.populate('author')
.exec( (err, book) => {
console.log('The author of '+book.title+' is '+book.author.name)
} )
到现在为止,我没有问题。我只是提供上下文。
现在我的问题是:
我知道在幕后,当我们调用.populate()
时,猫鼬对服务器进行了另一个查询。因此,要获取完整的数据,我们要进行两个查询。对于具有数千个并发用户的大型应用程序来说,这可能是个问题。
猫鼬有什么办法,所以只进行一次查询,而不是两次?
即MongoDB服务器应该自己解决它,而只发送最终结果,而不是客户端必须通过其他查询来解决ref
。
注意:无法更改数据库体系结构。