首页 文章

在Mongoose中搜索和删除数组的最佳方式

提问于
浏览
4

我想知道我在快递中使用mongoose的方式是否做错了 . 我的代码看起来不对 . 它需要2个mongoose查询才能在文档中添加内容,我想知道这是否可以简化 .

所以这个函数会在我的快递路由中引用,我该如何简化呢?它在集合中搜索用户通知文档,删除挂起数组中的某些内容并保存 . 我想添加另外2个查询来查找用户接受的请求文档并在其中添加旧的待处理文档,但它会在一个请求中总共进行4次查询和循环...它听起来不对...

var acceptRequest = function(userId, requesterId, callback){

    NotificationsReference.findOne({ id: userId}, function(err, result){
        if(err || result === null){
            callback("Could not accept notification. Stack: " + err);
        }
        else{
            var deletedRefId = 'unchanged';
            for(i = 0; i < result.pending.length; i++){

               if( result.pending[i].refId = requesterId){
                   //Removing searched element of the array
                   deletedRefId = result.pending.splice(i, 1);
                   result.save(function (err) {
                   if (err) { 
                        callback("Error in saving request(2). Stack Trace: " + err); 
                    }
                    else{
                        callback("Success");
                    }

               }

            }

        }
    });

}

2 回答

  • 0

    我有类似的问题,但现在我找到了解决方案 . 您可以从挂起的数组中删除项目,只需在其上调用remove函数,mongoose数组实现:http://jsdoc.info/SirUli/mongoose/types%7Carray.html#instance/remove

    var acceptRequest = function(userId, requesterId, callback){
    
    NotificationsReference.findOne({ id: userId}, function(err, result){
        if(err || result === null){
            callback("Could not accept notification. Stack: " + err);
        }else{
            var deletedRefId = 'unchanged';
            result.pending.remove(requesterId)
            result.save(callback(err))
        }
    });
    }
    
  • 2

    好吧,如果你想找到并更新一些东西,总会有两个请求:-)你可以尝试通过populate添加用户对NotificationsReference的引用,并在你获得NotificationsReference时正确修改它们 .

相关问题