当前位置: 首页 > 面试题库 >

我应该如何正确使用猫鼬填充?

计胤
2023-03-14
问题内容

我正在学习一些节点,并一直尝试使用猫鼬。目前,我的目标是学习如何使用populate。

我有一个projects定义,并milestone要求:

projectSchema = new mongoose.Schema({
    id: String,
    title: String,
    description: String,
    owner: String,
    site: String,
    creation_date: Date,
    milestone_ids: Array,
    milestones: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: "Milestone"
    }]
})

Project = mongoose.model("Project", projectSchema)
milestones = require(__dirname + "/milestones.js")();

然后我在某个时候执行此操作projects.js

Project.find(query, {}, {sort: {_id: -1}},
    function (error, results) {
        callback(results);
    }
).populate("milestones");

如何填充里程碑?

这是project来自mongo 的数据:

{
    "title": "sitename",
    "description": "online thing",
    "creation_date": {
        "$date": "2013-07-11T19:45:42.139Z"
    },
    "_id": {
        "$oid": "51df0b66dbdd7c4f14000001"
    },
    "milestones": [],
    "milestone_ids": [],
    "__v": 0
}

milestone是基本上与项目相关的一个:

{
    "title": "Proof of concept",
    "description": "Make it work.",
    "due_date": {
        "$date": "2013-07-11T19:46:38.535Z"
    },
    "project_id": "51df0b66dbdd7c4f14000001",
    "_id": {
        "$oid": "51df0b9edbdd7c4f14000002"
    },
    "__v": 0
}

另外,这是里程碑模式:

milestoneschema = new mongoose.Schema({
    id: String,
    title: String,
    description: String,
    owner: String,
    site: String,
    due_date: Date,
    project_id: {
        type: String,
        ref: "Project"
    }
})

Milestone = mongoose.model("Milestone", milestoneschema);

问题答案:

您需要获得定义查询选项然后执行的顺序,并且可链接的API(例如mongoose
Query)不知道在查询触发后您可能会调用哪些其他方法。因此,当您将回调传递给时.find,猫鼬会立即发送查询。

  • 由参数定义的查询 find
  • 由于存在回调,因此查询将立即执行并向数据库发出命令
  • 然后.populate发生,但是没有任何效果,因为查询已经发送到mongo

这是您需要做的:

Project.find(query, {}, {
    sort: {
        _id: -1
    }
}).populate("milestones").exec(function (error, results) {
    callback(results);
});

或者更具可读性:

Project
    .find(query)
    .sort('-_id')
    .populate('milestones')
    .exec(function(error, results) {                  
        callback(results);
    });

省略回调并使用 .exec

  • 查询传递给.find创建 带有参数的查询对象
  • 对的其他链接调用.sort.populate等等进一步配置了查询
  • .exec 告诉猫鼬您已完成配置查询,猫鼬发出了DB命令


 类似资料:
  • 问题内容: 我正在将node.js的猫鼬模式与express-validator(具有node-validator santiziations和Validator)一起使用。 存储商品价格的好方法是什么? 我目前有 价格是可选的,所以我有: express-validator给了我isNumeric(允许0填充),isDecimal和isInt …我宁愿只是将其转换为十进制并去除所有字符,所以我总

  • 问题内容: 我将MongoDB和Mongoose用作我的ODM,并且试图在同一条语句中使用和进行查询。 这是我的简单文档模型: 我只是想获取一个用户的每条消息,并按与他交谈的每个用户分组。我这样尝试过: 但是,不幸的是,我的模型没有方法。您有什么解决方案可以使它正常工作吗? 谢谢。 问题答案: 使用$ lookup的示例填充,lookup填充为数组,因此$ unwind。

  • 问题内容: 我有以下架构(在咖啡脚本中表示歉意) 我只想恢复一条肯定在我的数据库中的记录: 不幸的是,这总是记录下来。在mongo shell中总是返回一个值。到底是怎么回事? 问题答案: 发现问题,需要改用:

  • 问题内容: 我无法手动或自动在新保存的对象上填充创建者字段……我能找到的唯一方法是重新查询我已经想要做的对象。 这是设置: 这是我拉头发的地方 编辑:最新的猫鼬解决了此问题并添加了填充功能,请参见新的接受的答案。 问题答案: 您应该能够使用模型的填充函数来执行此操作:http : //mongoosejs.com/docs/api.html#model_Model.populate 在书籍的保存处

  • 问题内容: 我使用Mongoose.js,无法解决3级层次结构文档的问题。 有2种方法可以做到。 首先 -没有裁判。 我需要出示C记录。仅知道_id的C,如何填充/找到它? 我曾尝试使用: 但是我不知道如何从returnet得到一个对象,我只需要c对象。 其次, 如果使用裁判: 如何填充所有B,C记录以获取层次结构? 我试图使用这样的东西: 但是它将为single_c.title返回undefin

  • 我在nodeJs服务器中使用mongoose(4.13.10)连接到mongodb实例 我使用游标来迭代我的数据库的记录,并对数据库进行多次查询,这需要很多时间,因此我得到游标未找到异常。我发现这些发生是由于游标的空闲超时,符合我的观察。 现在,我不想将标记为true,而是将超时设置为某个高值,通过该值,我确信长时间运行的查询将完成。但我无法找到任何留档或指导如何设置服务器参数。 如何设置此参数?