2017-05-15 12 views
1

私は結果を出さずにこのクエリを約3時間苦労していました。私はこのマングースのスキーマがあります。配列内に複数のオブジェクトを追加して削除するMongoDBクエリ

var User = mongoose.Schema({ 
    username: { type: String, required: true }, 
    email: { type: String, required: true }, 
    password: { type: String, required: true }, 
    name: { type: String, required: true }, 
    surname: { type: String, required: true }, 
    tags: [{ 
    type: { type: String }, 
    name: { type: String } 
    }, { _id: false }] 
}; 

を、私は、タグ配列にいくつかの操作を実行する必要があります。私がする必要があるのは、単にクライアントによって送信されたタグを追加したり削除したりすることだけです。私はそれを行うには、2つのネストされたクエリを作成しました:

updateTagsById: function(id, obj){ 
     var add = []; 
     var remove = []; 
     for (var i = 0; i < obj.add.length; i++) { 
      add.push({ type: obj.type, name: obj.add[i] }); 
     } 
     for (var i = 0; i < obj.remove.length; i++) { 
      remove.push({ type: obj.type, name: obj.remove[i] }); 
     } 
     User.update({_id: id} , { $pushAll:{ tags: add } }, function(err){ 
      if(err) throw err; 
      User.update({_id: id} , { $pullAll: { tags: remove } }, function(err){ 
      if(err) throw err; 
      console.log('ok'); 
      return true; 
      }); 
     }); 
    } 

すべての関数がエラーなしで実行されますが、私はモンゴシェルに行けば、私は唯一のプッシュクエリがうまくいくことがわかります。私は結果なしで様々な種類のクエリを試しました。誰も私が2番目のクエリが機能しない理由を理解するのを助けることができますか?

EDIT: これは、タイプが単純な文字列であり、追加と削除が文字列の配列であるmy objオブジェクトに関する構造体です。

var obj = { 
    type: $rootScope.Modal.content, 
    add: $rootScope.Modal.addCache, 
    remove: $rootScope.Modal.removeCache 
} 
+0

あなたがその関数に渡すパラメータ 'id'と' obj'の例を見る必要があります –

+0

@JoshBeam idは正しいユーザIDですが、objは3つの属性で構成されるオブジェクトです:type 、追加して削除します。このすべてのものは大丈夫です、私はそれをテストしました。 – Gianmarco

答えて

0

ネストされたクエリを変更することでこの問題を解決しました。

User.update({_id: id} , { $pushAll:{ tags: add } }, function(err){ 
     if(err) throw err; 
     User.update({_id: id} , { $pull: { tags: { name: { $in: obj.remove } } } }, function(err){ 
      if(err) throw err; 
     }); 
    }); 

これでかなりうまくいきます。

関連する問題