2016-11-20 7 views
0

Вот основной код, чтобы посмотреть вКак правильно использовать 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); 
    } 
);} 

(я изменил код, чтобы быть вообще. Если вам нужен специфический код, просто спросите меня, чтобы обновить это пост)

Я пытаюсь сделать Model.findOneandUpdate с upsert: истинный.
Мой код выполняется, когда конкретное событие, излучаемый

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

из еще потому «array.index»: {$ пе: value.index} запроса, код создает новый после первого исполнения.

Поэтому

db.collection.find()

возвращает несколько документов, имеет же свойство с различными ObjectId.
Для примера,

{ "_id": ObjectId ("1"), тест: "А", массив: [{индекс: "1"}]}
{ "_id": ObjectId ("2"), тест: "А", массив: [{индекс: "1"}]}

Я хочу быть код сделать

  1. Проверить документ существует, или нет.
  2. Если существует, добавьте новое значение в массив документа. Кроме того, новое значение должно быть уникальным по индексу .
  3. Если НЕ существует, создайте новый документ и добавьте новое значение в новый массив документа.

UPDATE:
Я также пытаюсь сделать это

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

Этот результат кода в не делать ничего.

UPDATE
Я также попробовать это,

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

Но, это создать новый документ каждым другим значением индекса.

UPDATE

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

Он также не работает ...

ответ

0

я нашел, как решить эту проблему! Во-первых, причина, по которой возникает проблема, я пытаюсь сделать upsert с $ ne. Это мой код,

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

    }); 
Смежные вопросы