如何正确使用Mongoose查询,查找和更新对象数组

时间:2016-11-20 16:16:08

标签: javascript node.js mongodb mongoose

这是要查看的主要代码

function update(feed){
//.. do set up
var target = feed.title;
var value = {index: feed.value};

var query = { test: target, 'array.index': {$ne: value.index} },
    update = { $push : {"array" : value} },
    options = { upsert: true, new: true };

Model.findOneAndUpdate(query, update, options, function(err, docs) {
        if(err) throw err;
        console.log(docs);
    }
);}

(我将代码修改为一般代码。如果您需要特定代码,请让我更新此帖子)

我正在尝试使用 upsert执行 Model.findOneandUpdate :true
我的代码在发出特定事件时执行

feedparser.on('readable', function() {
    update(this.read());
});

' array.index':{$ ne:value.index} 查询中,代码在首次执行后创建新的。

因此,

  

db.collection.find()

返回具有不同ObjectId的相同属性的多个文档 例如,

  

{" _id":ObjectId(" 1"),test:" A",array:[{index:" 1" }]}
  {" _id":ObjectId(" 2"),test:" A",array:[{index:" 1"}]}

我想成为代码

  1. 检查文档是否存在。
  2. 如果存在,请将新值添加到Document的数组中。此外,新值应该是唯一的索引
  3. 如果不存在,请创建新文档并向新文档阵列添加新值。
  4. 更新
    我也尝试通过

    来做到这一点
    var doc = Model.findOne({ test: target });
    
    if(doc != null){
        var query = { _id: doc._id, 'array.index': {$ne: value.index} };
        var update = { $push : {"array" : value} };
        var options = {new: true};
        Model.update(query, update, options, function(err, d){
            if(err) throw err;
            console.log(d);
        });
    
    }else{
        doc = {
            test: target,
            array:[value]
        };
    
        Model.create(doc, function (err, res){
            if(err) throw err;
            console.log(res);
        });
    }
    

    此代码导致无效。

    更新

    我也试试这个
    Model.findOne({ test:target }, function(err, doc){
        if(doc === null){
            doc = {
                test: target
                arrays:[value]
            };
    
            Animation.create(doc, {new: true}, function (err, res){
                if(err) throw err;
                console.log(res);
            });
        }else{
            var query = { _id: doc._id, 'arrays.index': {$ne: value.index} };
            var update = { $push : {"arrays" : value} };
            var options = {new: true};
            Animation.update(query, update, options, function(err, res){
                if(err) throw err;
                console.log(res);
            });
        }
    });
    

    但是,它会根据每个不同的索引值创建新的文档。

    更新

    var query = { test: target, 'array:index': {$ne: value.index} };
    var update = { $push : {'array' : value}};
    var options = {new: true};
    Model.findOneAndUpdate(query, update, options, function(err, doc){
        if(err) throw err;
        if(doc === null){
            doc = new Model({
                test: target,
                array:[value]
            });
            doc.save();
        }
    });
    

    它也不起作用......

1 个答案:

答案 0 :(得分:0)

我找到了如何解决这个问题! 首先,问题出现的原因是我试图用 $ ne upsert 。 这是我的代码,

Animation.findOne({ title: AnimationTitle, team: TeamName }, function(err, result){
        if(err) { throw err; }
        if(result){
            Animation.findOneAndUpdate({ title: AnimationTitle, team: TeamName, 'episodes.number': {$ne: episode.number} }, { $addToSet : {'episodes' : episode}}, {new: true}, function(err, result){
                if(err) { throw err; }
            });
        }else{
            Animation.findOneAndUpdate({ title: AnimationTitle, team: TeamName }, { $addToSet : {'episodes' : episode}}, {new: true, upsert: true}, function(err, result){
                if(err) { throw err; }
            });
        }

    });