2012-11-05 8 views
7

次のサーバーメソッドは、ユーザーが見つからないため重複したキーエラーを投げています。典型的なクエリは次のとおりです。{サービス:{ログインfacebook:{ID:「XXXX」}}}サーバー上の流星ユーザーの検索

Meteor.methods 
    getUser: (query, data = {}) -> 
    user = Meteor.users.findOne(query) 
    return user if user? 
    user = _.extend(data, query) 
    user._id = Meteor.users.insert user 
    return user 

ユーザーが発見されない理由は、サーバーメソッドがそう、コレクション内のすべての文書へのアクセスを持っていることを私の理解でありますインサートは重複するFacebookのIDのために失敗しますか?

これは私のosx開発環境ではうまく動作しますが、私のubuntuサーバ(バンドルされている)でNODE_ENV = productionで動作していません。ここで

はログ出力されます:

data: { services: { facebook: { id: 'xxxx' } } } (the query provided to getUser) 
data: undefined (the result of findOne) 
data: Exception while invoking method 'getUser' MongoError: E11000 duplicate key error index: thunderstruck.users.$services.facebook.id_1 dup key: { : "xxxx" } 
data:  at Db.wrap (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/db.js:1904:11) 
data:  at null.<anonymous> (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/collection.js:320:26) 
data:  at g (events.js:192:14) 
data:  at EventEmitter.emit (events.js:126:20) 
data:  at Db._callHandler (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/db.js:1439:25) 
data:  at Server.connect.connectionPool.on.server._serverState (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/connection/server.js:425:30) 
data:  at MongoReply.parseBody (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:127:5) 
data:  at Server.connect.connectionPool.on.server._serverState (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/connection/server.js:384:22) 
data:  at EventEmitter.emit (events.js:96:17) 
data:  at _connect (/home/jeremy/deploy/thunderstruck/releases/20121105202012/bundle/server/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:136:13) 
+0

私はちょうどこのようなクエリをフォーマットすることによって動作させました:{"services.facebook.id": "xxxx"}入れ子が深すぎると思われます。私は、ノードインスペクターを使用してサーバー上でさまざまなクエリを試してみました。深いネスティングがOSX上で動作し、Linuxで失敗する理由はまだ不明です。 –

答えて

14

それらは異なるMongoDBのクエリで、あなたは間違いなくあなたがに切り替え点線のスタイルをしたいです。詳しくは、Mongo Dot Notationのマニュアルを参照してください。

Meteor.users.find({"services.facebook.id": "foo"}) 

は、値がfooの埋め込みプロパティを持つドキュメントを返します。

Meteor.users.find({services: {facebook: {id: "foo"}}}) 

正確その構造を持つドキュメントに一致します。埋め込まれたFacebookのドキュメントに他のフィールドがある場合、それは一致しません。プロダクションDBのドキュメントにフィールドが増えていて、一致が得られなかった可能性があります。