Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据对子文档中父文档的引用查找文档_Javascript_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

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()