删除项目mongodb和节点async



我在从upload[]对象中删除一个项目时遇到了麻烦。
下面表示用户,keys[]表示文件上传与之关联的密钥,uploads[]是该密钥下的文件。这些都是嵌入在User模型中的文档。我现在意识到如果我使用推荐信会更好,但我现在被困在这里了。下面是我现在用来查找uploads项目

的函数

______________ 这是我目前的函数 _____________________

老实说,我正在使用async,我不太理解它。是否有不同的异步函数或方法来查找这些项目在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"
                }
            ]
         }
}

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

  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没有"break"。因此,如果您不想进行不必要的处理,请像我一样使用for并附加一个断点。

在循环中没有async调用,所以不需要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?
            }
        });
    });
  });
};

最新更新