删除项目 mongodb 和节点异步

Posted

技术标签:

【中文标题】删除项目 mongodb 和节点异步【英文标题】:Deleting item mongodb and node async 【发布时间】:2014-09-08 22:36:07 【问题描述】:

我在从上传 [] 对象中删除项目时遇到问题。 下面代表一个用户,keys[] 代表与文件上传相关联的键,uploads[] 是该键下的文件。这些都是嵌入在 User 模型中的文档。我现在意识到使用引用会更好,但我现在坚持这一点。这是我现在用来查找上传项的功能,

______________这是我当前的功能___________

老实说,我正在使用异步,但我并不完全理解它。是否有不同的异步函数或方法在 mongo 中查找这些项目会更好? 当前问题: 1)即使找到正确的项目,它也会继续循环直到结束。 2) 如何删除上传的项目?

exports.getApiDelete = function (req, res, next) 
  User.findById(req.user.id, function(err, user) 
    if (err) return next(err);
    console.log("User ID found: "+ user._id);
    //loop though user keys
    async.forEach(user.profile.keys, function(item, callback) 
    //verify key exists
      if(item.key==req.params.scriptkey)console.log("KEY FOUND");
      async.forEach(item.uploads, function(item, callback) 
        //verify file exits
        console.log(req.params.file_id);
        if(item._id == req.params.file_id)

        // DELETE FUNCTION HERE?

        ;
      , function(err)
        console.log('Error during async lookup: '+err);
        );

  , function(err)
    console.log('Error during async lookup: '+err);
    );
  );
;

______________________________这是我的用户模型___________


"__v": 19,
"_id": 
    "$oid": "53c812c4e75ab0b013f3c6bc"
,
"email": "fake@mailinator.com",
"password": "fake",
"profile": 
    "gender": "",
    "keys": [
        
            "_id": 
                "$oid": "53c8130ae75ab0b013f3c6bd"
            ,
            "status": false,
            "iteration": 0,
            "created": 
                "$date": "2014-07-17T18:16:42.568Z"
            ,
            "uploads": [],
            "description": "This is being run from my Windows Desktop.",
            "location": "Front Row",
            "name": "fake_Desktop",
            "key": "80f94c80-0dde-11e4-ae14-43922f7b8f23"
        ,
        
            "_id": 
                "$oid": "53c814ade75ab0b013f3c6be"
            ,
            "created": 
                "$date": "2014-07-17T18:23:41.777Z"
            ,
            "description": "Windows VM test.",
            "iteration": 12,
            "key": "7ad78410-0ddf-11e4-ae14-43922f7b8f23",
            "location": "Back Right",
            "name": "fake2_Desktop",
            "status": false,
            "uploads": [
                
                    "_id": 
                        "$oid": "53c81517e75ab0b013f3c6bf"
                    ,
                    "ip": "10.0.1.156",
                    "fname": "hklm_1.txt",
                    "iteration": 1,
                    "created": 
                        "$date": "2014-07-17T18:25:27.241Z"
                    ,
                    "filepath": "script_uploads/7ad78410-0ddf-11e4-ae14-43922f7b8f23_1_hklm_1.txt"
                ,
                
                    "_id": 
                        "$oid": "53c8151ae75ab0b013f3c6c0"
                    ,
                    "ip": "10.0.1.156",
                    "fname": "hklm_1.txt",
                    "iteration": 2,
                    "created": 
                        "$date": "2014-07-17T18:25:30.634Z"
                    ,
                    "filepath": "script_uploads/7ad78410-0ddf-11e4-ae14-43922f7b8f23_2_hklm_1.txt"
                
            ]
         

【问题讨论】:

【参考方案1】:

您只想从数组中删除?如果是,请使用

  for(var i =0, j = item.uploads.length; i < j; i++) 
    //verify file exits
    console.log(req.params.file_id);
    if(item.uploads[i]._id == req.params.file_id)

        item.uploads.slice(i, 1);

    ;

最后使用:user.save(function(err)); 如果您想从文件系统中删除任何内容,请使用:

fs = require('fs');
fs.unlink( FILE PATH , function(err) 
    console.log(err);
);

此外,您实际上并不需要 forEach 的异步版本,因为 User.findById 本身是异步的,整个过程都在后台进行。

这将继续循环直到结束,即使它找到了 正确的项目。

async.forEach 没有“中断”。因此,如果您不想执行不需要的过程,请像我一样使用 for 并附加一个断点。

【讨论】:

【参考方案2】:

您的循环中没有异步调用,因此您不需要 async.forEach()。使用 javascript 原生循环就好了:

exports.getApiDelete = function (req, res, next) 
  User.findById(req.user.id, function(err, user) 
    if (err) return next(err);
    console.log("User ID found: "+ user._id);
    user.profile.keys.forEach(function(el) 
        if(el.key==req.params.scriptkey)console.log("KEY FOUND");
        el.uplaods.forEach(function(item) 
            console.log(req.params.file_id);
            if(item._id == req.params.file_id)

                // DELETE FUNCTION HERE?

            
        );
    );
  );
;

【讨论】:

以上是关于删除项目 mongodb 和节点异步的主要内容,如果未能解决你的问题,请参考以下文章

mongodb replset删除arbiter节点

回调不是使用节点 js 的异步模块的 mongodb 查询中的函数

MongoDB 副本集节点添加与删除

搭建MongoDB副本集&分片

Node.js mongodb 驱动程序异步/等待查询

Mongodb副本集存储回收