2016-11-20 2 views
0

を検索し、更新することはメインのコードがはどのように適切にマングースのクエリを使用するには、ここでオブジェクト配列

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をやろうとしています:真。 {$ NE:value.index}クエリのコードは最初の実行後、新しいものを作成し、特定のイベントが

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

Becasue 'array.index' から出射されたとき
私のコードを実行します。したがって

db.collection.findは()

別のObjectIdと同じ性質を持つ複数のドキュメントを返します。
例について 、

{ "_id":のObjectId( "1")、テスト: "A"、配列:[{度: "1"}]}
{ "_id" のObjectId( "2")、テスト: "A"、配列:[{度: "1"}]}

Iコードにしたいは

  1. チェック文書が存在するかしません。
  2. Existの場合、ドキュメントの配列に新しい値を追加します。また、新しい値はインデックスで一意である必要があります。
  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; } 
      }); 
     } 

    }); 
関連する問題