Javascript 根据对子文档中父文档的引用查找文档
有两个集合电影和分级电影。这两个集合具有引用关系Javascript 根据对子文档中父文档的引用查找文档,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,有两个集合电影和分级电影。这两个集合具有引用关系 电影模式 var mongoose = require('mongoose'); var movieSchema = new mongoose.Schema({ m_tmdb_id: { type: Number, unique: true, index: true }, m_adult: { type: Boolean }, m_backd
电影模式
var mongoose = require('mongoose');
var movieSchema = new mongoose.Schema({
m_tmdb_id: {
type: Number,
unique: true,
index: true
},
m_adult: {
type: Boolean
},
m_backdrop_path: {
type: String,
},
m_title: {
type: Number
},
m_genres: {
type: Array
}
});
var MovieModel = mongoose.model('Movie', movieSchema);
module.exports = {
movie: MovieModel
}
var mongoose = require('mongoose');
var rankMovieSchema = new mongoose.Schema({
movie: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Movie',
unique: true
},
rank: {
type: Number
},
count: {
type: Number
}
});
var RankMovieModel = mongoose.model('RankMovie', rankMovieSchema);
module.exports = {
rankmovie: RankMovieModel
}
对电影模型进行排名
var mongoose = require('mongoose');
var movieSchema = new mongoose.Schema({
m_tmdb_id: {
type: Number,
unique: true,
index: true
},
m_adult: {
type: Boolean
},
m_backdrop_path: {
type: String,
},
m_title: {
type: Number
},
m_genres: {
type: Array
}
});
var MovieModel = mongoose.model('Movie', movieSchema);
module.exports = {
movie: MovieModel
}
var mongoose = require('mongoose');
var rankMovieSchema = new mongoose.Schema({
movie: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Movie',
unique: true
},
rank: {
type: Number
},
count: {
type: Number
}
});
var RankMovieModel = mongoose.model('RankMovie', rankMovieSchema);
module.exports = {
rankmovie: RankMovieModel
}
我需要从集合排名电影中选择具有特定标题的所有项目[电影集合的条件]。我如何实现这一点?实际上,实现这一点的“最佳”方法是使用和“加入”数据,并对匹配条件进行“筛选”。这是非常有效的,因为MongoDB实际上在“服务器”本身上执行所有这些操作,而不是发出“多个”查询
注意:使用RankMovieModel.collection.name
是从Mongoose注册的Model
中获取“基础”集合名称的好方法。由于操作是在“服务器”上进行的,MongoDB需要“真实的集合名称”,因此我们可以“硬编码”,也可以从模型本身注册的信息中获取。就像这里一样
如果有“很多”排名,那么您最好使用它,它将为每个相关的“排名”项目创建一个文档:
这里还特别介绍了MongoDB如何处理“加入”文档以避免违反16MB BSON限制。所以事实上,这个特殊的事情发生在管道阶段之后:
{
"$lookup" : {
"from" : "rankmovies",
"as" : "rankings",
"localField" : "_id",
"foreignField" : "movie",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
}
}
}
因此,实际上“消失”了,而是“卷起”到自身中,就好像这是“一个”操作一样。这样,我们就不会直接在父文档中创建一个“数组”,在极端情况下,它会导致许多“相关”项的大小超过16MB
如果您没有支持的MongoDB(MongoDB 3.2 minumum),则可以使用“虚拟”替换(至少需要Mongoose 4.5.0)。但请注意,这实际上执行了对服务器的“两个”查询: 首先将“虚拟”添加到架构中:
movieSchema.virtual("rankings",{
"ref": "Movie",
"localField": "_id",
"foreignField": "movie"
});
然后使用以下命令发出查询:
谢谢你的帮助。我的要求有点不同。更新了问题。@Muhsin这太粗鲁了。问题完全不同。你应该回到你原来的问题上来。像那样改变你的问题不是礼貌的行为方式。对于你实际提出的问题,你有一个答案。其他问题都是新问题。很高兴看到新的问题,只要这个问题保持不变。@muxin谢谢,那就更好了。给你将来的帖子的提示。不要“模糊”对象ID的值。特别是当您提供与“连接”相关的数据时。一旦你这样做了,它会使值“无效”,人们就不能简单地“复制”数据,并用它来测试可能给你答案的解决方案。因此,当你在这个问题上提问时,请确保使用可以通过简单的“复制/粘贴”操作应用的值,以便人们能够实际使用它。
MovieModel.find({ "m_title": m_title })
.populate('rankings')
.exec()