猫鼬从另一个集合中获取文档,该集合以当前集合的文档作为参考
Mongoose fetch documents from another collection which has current collection's document as reference
我在 MongoDB 中有两个模式,一个是作者,第二个是书。作者有很多书。
作者架构:
var authorSchema = {
name:{
type: String
},
books:[{
type: Schema.Types.ObjectId,
ref: 'Book'
}]
}
书籍架构:
var bookSchema = {
title:{
type: String
}
}
现在我正在创建一个图书列表页面,我想在其中使用图书集获取每本书的所有作者。我该怎么做?
假设您有一本书的 _id
值,您将查询作者集合,而不是图书集合来获取该书的作者:
Author.find({books: book._id}, function(err, authors) { ... });
如果您实际上是在要求 "relation" 完成 "other way around",那么答案首先就是 "store" 这种关系。
因此:
var bookSchema = new Schema({
title: { type: String },
author: { type: Schema.Types.ObjectId }
});
因此,将 "relation" 视为 "two way",因为每个对象都具有 "relate" 所需的信息。
这基本上意味着您可以执行以下操作:
Books.find({ "author": authorId })
.populate("author")
.exec(function(err,books) {
// stuff in here
});
没有可怕的构造是:
Books.find().execute(function(err,books) {
var results = [];
async.each(books,function(book,callback) {
Author.findOne({ "books": book._id },function(err,author) {
var obj = book.toObject();
book.author = author;
results.push(books);
callback(err);
});
},
function(err) {
if (err) throw err;
console.dir(results);
});
})
所以按照原来的建议做的更好。
我在 MongoDB 中有两个模式,一个是作者,第二个是书。作者有很多书。
作者架构:
var authorSchema = {
name:{
type: String
},
books:[{
type: Schema.Types.ObjectId,
ref: 'Book'
}]
}
书籍架构:
var bookSchema = {
title:{
type: String
}
}
现在我正在创建一个图书列表页面,我想在其中使用图书集获取每本书的所有作者。我该怎么做?
假设您有一本书的 _id
值,您将查询作者集合,而不是图书集合来获取该书的作者:
Author.find({books: book._id}, function(err, authors) { ... });
如果您实际上是在要求 "relation" 完成 "other way around",那么答案首先就是 "store" 这种关系。
因此:
var bookSchema = new Schema({
title: { type: String },
author: { type: Schema.Types.ObjectId }
});
因此,将 "relation" 视为 "two way",因为每个对象都具有 "relate" 所需的信息。
这基本上意味着您可以执行以下操作:
Books.find({ "author": authorId })
.populate("author")
.exec(function(err,books) {
// stuff in here
});
没有可怕的构造是:
Books.find().execute(function(err,books) {
var results = [];
async.each(books,function(book,callback) {
Author.findOne({ "books": book._id },function(err,author) {
var obj = book.toObject();
book.author = author;
results.push(books);
callback(err);
});
},
function(err) {
if (err) throw err;
console.dir(results);
});
})
所以按照原来的建议做的更好。