首页 文章

使用Mongoose返回更新的集合

提问于
浏览
23

我使用nodejs / express / mongoose / angularjs . 我想更新一个名为Lists的集合,它有几个属性,其中一个是项目数组 . 在下面的代码中,我在items数组中推送一个新的任务项 . 一切正常,但更新功能不会发回更新的集合,然后我必须对数据库执行另一个查询 . 有没有更有效的方法来做到这一点?

The nodejs/express code :

exports.addTaskToList = function(req, res) {
    var listId = req.params.Id;
    var taskId = req.params.TaskId;
    Lists.update({_id: listId}, {$push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){
        if(err) {
            console.log('Error updating todo list. ' + err);
        }
        else{
            console.log(result + ' todo list entry updated - New task added');
            Lists.findById(listId).populate('items').exec(function (err, updatedEntry) {
                if (err) {
                    console.log('Unable to retrieve todo list entry.');
                }
                res.send(JSON.stringify(updatedEntry));
            });
        }           
    });
};

此外,数组项是ObjectIds的数组 . 这些项目位于单独的模式中,因此位于单独的集合中 . 是否可以推送整个对象而不仅仅是_id,以便不会创建另一个集合?

3 回答

  • 1

    update method doesn't return 更新后的文件:

    但是,如果我们不需要在我们的应用程序中返回的文档而只是想直接更新数据库中的属性,那么Model#update适合我们 .

    如果您需要 update and return 该文档,请考虑以下选项之一:

    传统方法:

    Lists.findById(listId, function(err, list) {
        if (err) {
            ...
        } else {
            list.items.push(taskId)
            list.save(function(err, list) {
                ...
            });
        }
    });
    

    更短的方法:

    Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) {
        ...
    });
    
  • 14

    使用 findOneAndUpdate() 方法并在查询参数中使用选项为 { "new": true}

    return this.sessionModel
           .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true})
           .exec()
           .then(data=>{
            return {
              sid: data.session_id
                }
            })
    
  • 25

    关于你的上一个问题:

    是否可以推送整个对象而不仅仅是其_id,以便不会创建另一个集合?

    答案是肯定的 . 您可以使用Mongoose(documentation on sub-documents here)轻松地将子文档存储在文档中 . 通过稍微更改模式,您可以将整个项目对象(不仅仅是项目 _id )推送到List模式中定义的项目数组中 . 但是您需要修改架构,例如:

    var itemSchema = new Schema({ 
        // Your Item schema goes here
        task: 'string'       // For example
    });
    
    var listSchema = new Schema({
        // Your list schema goes here
        listName: String,    // For example...
        items: [itemSchema]  // Finally include an array of items
    });
    

    通过将 item 对象添加到列表的 items 属性,然后保存该列表 - 您的新项目将保留到List集合中 . 例如,

    var list = new List({
        listName: "Things to do"
    });
    
    list.items.push({
        task: "Mow the lawn"
    });
    
    list.save(function(error, result) {
        if (error) // Handle error
        console.log(result.list) // Will contain your item instance
    });
    

    因此,当您加载列表时, items 属性将预先填充您的项目数组 .

    这是因为Items不再将其保留为单独的集合 . 它将作为List的子文档持久保存到List集合中 .

相关问题