首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Mongoose返回更新的集合

使用Mongoose返回更新的集合
EN

Stack Overflow用户
提问于 2013-12-19 04:27:35
回答 3查看 37.9K关注 0票数 29

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

nodejs/express代码:

代码语言:javascript
复制
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,这样就不会创建另一个集合?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-19 06:23:13

update method 不会返回更新后的文档:

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

如果您需要对文档进行更新和返回,请考虑以下选项之一:

传统方法:

代码语言:javascript
复制
Lists.findById(listId, function(err, list) {
    if (err) {
        ...
    } else {
        list.items.push(taskId)
        list.save(function(err, list) {
            ...
        });
    }
});

更短的方法:

代码语言:javascript
复制
Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) {
    ...
});
票数 27
EN

Stack Overflow用户

发布于 2017-02-22 15:53:26

使用新方法和查询参数中的use option as {“findOneAndUpdate()”:true}

代码语言:javascript
复制
return this.sessionModel
       .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true})
       .exec()
       .then(data=>{
        return {
          sid: data.session_id
            }
        })
票数 34
EN

Stack Overflow用户

发布于 2013-12-19 06:28:07

关于你的最后一个问题:

是否可以推送整个对象,而不仅仅是它的_id,这样就不会创建另一个集合?

答案是肯定的。使用Mongoose (documentation on sub-documents here)可以很容易地在文档中存储子文档。只需稍微更改一下模式,就可以将整个item对象(不仅仅是item _id)推入列表模式中定义的项目数组中。但是您需要修改您的模式,例如:

代码语言:javascript
复制
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
});

通过向列表的items属性添加item对象,然后保存该列表,您的新项目将持久保存到列表集合中。例如,

代码语言:javascript
复制
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属性将预先填充您的项目数组。

这是因为项将不再将其持久化为单独的集合。它将作为列表的子文档持久化到列表集合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20667739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档