提问者:小点点

如何正确使用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);
    }
);}

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

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

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

由于“array. index”:{$ne:value.index}查询,代码在第一次执行后创建新查询。

因此,

db.集合.查找()

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

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

我想成为代码做

  1. 检查文档是否存在。
  2. 如果存在,则向Document的数组添加新值。此外,新值应按索引唯一。
  3. 如果不存在,则创建新文档并将新值添加到新文档的数组中。

更新:
我也尝试通过

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个答案

匿名用户

我找到了解决这个问题的方法!首先,出现问题的原因是我正在尝试使用$ne进行up0018。这是我的代码,

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; }
            });
        }

    });