7

次のサーバー メソッドは、ユーザーが見つからないため、重複キー エラーをスローしています。典型的なクエリは次のとおりです: {services: {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)
4

1 に答える 1

14

これらは異なる MongoDB クエリであり、切り替えたドット スタイルが絶対に必要です。Mongo Dot Notationのドキュメントを参照してください。

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

value で探している埋め込みプロパティを持つドキュメントを返しますfoo

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

正確にその構造を持つドキュメントのみに一致します。埋め込まれた facebook ドキュメントに他のフィールドがある場合、一致しません。本番 DB のドキュメントにはより多くのフィールドがあるため、一致が得られなかった可能性があります。

于 2012-11-09T17:02:29.260 に答える