2017-06-24 7 views
0

私はこれを今何時間も解決しようとしていますが、うまくいきません。mongoコレクション内の特定のフィールドに特定の値が含まれている場合にのみ関数を実行する方法はありますか?

"storedKeys"というコレクションに、配列フィールドとして "キー"(および他の重要ではない情報)を格納しました。

これは次のようになります。今

{ 
    "_id" : "Company(02fd8fba13cf51cf)", 
    "infos" : { 
     "companyName" : "company", 
     "street" : "exampleStreet", 
     "number" : "123", 
     "city" : exampleCity", 
     "createdAt" : ISODate("2017-06-24T13:20:09.771Z") 
    }, 
    "key" : ["123456789"] 
} 

、私は流星のメソッドを呼び出すことにより、他のコレクションにいくつかの更新を実行するための権限として、この「キー」フィールドを使用します。さらに、このメソッドは、storedKeys内の正しい_idが存在する場合にのみ実行する必要があります。

より正確に:イベントハンドラによってメソッド呼び出しに入れられた変数がコレクションのstoredKeysの定義されたフィールドと一致する場合、メソッドを実行します。それ以外の場合は、エラーをスローしてメソッドを実行しないでください。

クライアント:その目的のため

、私が提出フォームによってなどのようなサーバー側の方法で見つける({})関数であれば、句を使用しようとした以外メソッドをコールしようとしました(トリガー方式)

Template.keyCollectionThing.events({ 
"submit form": function (e) { 
e.preventDefault(); 
var key = "123456789"; 
var id = "Company(02fd8fba13cf51cf)"; 
Meteor.call('updateOtherCollections', key, id); 
} 
}); 

サーバー(runメソッド)

Meteor.methods({ 
     'updateOtherCollections': function(key, id) { 

    if(storedKeys.find({"key": key}) && storedKeys.find({"_id": id})) { 

     Meteor.users.update(
      {'_id': this.userId 
      }, { 
       $push: { 
       'pushedId': id 
        } 
       }); 

     otherDB.update(
     {'_id': this.userId 
     }, { 
     $push: { 
      'pushedId': id 
     } 
     } 
    ); 

     storedKeys.update(
     {'_id': id 
    }, { 
     $set: { 
     "key": [] 
     } 
    }); 
    }} 
}); 

しかし、問題は、storedKeysにキーが存在しないか、またはstoredKeysの_idが存在しない場合でも、は常にが正常に実行されていることです。したがって、if()とfind({))によって期待される検証はありません。メソッドは常に実行され、コレクションは更新されます(キーを持っていなくてもドアを開くことができます)。

私は何か助けや新しいアプローチに非常に感謝しています!

答えて

2

.find()は常にtruthyなり関数あるカーソルを返します。

単一のドキュメントが見つかると思われる場合は、.findOne()を使用してください。 > 0が見つかると予想される場合は.find(query).count()をテストできます(0は偽で、他の数字は真実です)

+0

完璧! .findOne()はこの問題を解決しました。多くのおかげです。 – Jaybruh

関連する問題