2016-03-23 4 views
1

を挿入する場合、私は、タグのMongoのコレクションを持っており、ユーザーがタグの配列を入力したときに、私は次の操作を実行したい参照してください、MongoDBのは、アレイ内のすべての項目が存在し、他の更新が

配列のタグが存在する場合配列内のタグが存在しない場合は、カウント を更新し、私が現在持っている0

のカウントを挿入します。

QuestionTags.update({'tag': {$in: tagArray}}, {$inc : {'count': +1} }, { upsert: true }); 

QuestionTagsはデシベルコレクションのマングーススキーマです。

これは機能していないようです。私は新しいタグの配列を入力し、それらは追加されておらず、既存のタグはインクリメントされていません。

tagArrayをループせずに配列を処理する方法はありますか?配列内の各項目に対してdbコールを行いますか?

UPDATE: はnewTagsがnullの場合、しかしこの

QuestionTags.update({'tag': {$in: req.body.tags}}, {$inc : {'count': +1} }, { upsert: true, multi: true }); 
QuestionTags.find({'tag' :{$nin: req.body.tags}}, function(err, newTags) { 
    console.log("New Tags :" + newTags); 
    var tagArray = []; 
    newTags.forEach(function(tag){ 
     var tagObj = { 
      tag: tag, 
      count: 1 
     } 
     tagArray.push(tagObj); 
    }); 
    QuestionTags.collection.insert(tagArray); 
}); 

に私のコードを変更しました。 QuestionTagsコレクションは現在空ですので、nullにすることはできません。

+0

あなたtagArrayには何ですか?単純な文字列ですか?私はちょうどテストをして、あなたの更新クエリで作業を増やしています。挿入するには、更新オブジェクト(更新の2番目のパラメータ)に '$ set:{tag: 'newTag'}'を持たないので、upsertは実際に何も挿入していません。 – Komo

+0

@Komo yeahの単純な文字列["Java"、 "JavaScript"、 "Agile"]。それ以外のものがすべて動作している場合は、正しい方法で解決策を投稿することができます – erichardson30

+0

@Komoはあなたが投稿した解決策を働かせませんでしたか? – erichardson30

答えて

1

ループ内でクエリを実行することなく、これをいくつかのクエリで実行できると思います。

1)既存のタグがカウント更新:あなたのクエリが動作します。

QuestionTags.update({'tag': {$in: tagArray}}, {$inc : {'count': +1} },{multi: true}); 

2)新しいタグを検索:

QuestionTags.find({},function(err, tags) { 
    var newTagObj = []; 

    // tags is originally an array of objects 
    // creates an array of strings (just tag name) 
    tags = tags.map(function(tag) { 
     return tag.tag; 
    }); 

    // returns tags that do not exist 
    var newTags = tagArray.filter(function(tag) { 
     // The count = 1 can be done here 
     if (tags.indexOf(tag) < 0) { 
      tag.count = 1; 
     } 

     return tags.indexOf(tag) < 0; 
    }); 

    // creates tag objects with a count of 1 
    // adds to array 
    // (this can be done in the previous loop) 
    newTags.forEach(function(tag) { 
     var tagObj = { 
      tag: tag, 
      count: 1 
     } 
     newTagObj.push(tagObj); 
    }); 

これはあなたのデータベースに存在しないタグの配列を与えます。

3)findコールバックで、2の結果を使用して新しいタグを挿入します。

QuestionTags.collection.insertMany(newTagObj); 
+0

全体的にこれはかなりうまくいきます。しかし、カウントは更新されていないようです。タグに同じ 'タグ'属性があっても毎回新しいレコードを挿入するだけです。 – erichardson30

+0

ええと、更新クエリでupsertオプションを削除しましたか?少なくとも、新しいレコードを追加すべきではありません。 – Komo

+0

ええ、更新クエリはそれと同じです。なぜそれが動作していないのか分かりません。私はtagArrayを更新する前に、フィルタの前にログアウトしてから、新しいタグとそれらすべてに同じ項目が含まれています – erichardson30

関連する問題