以下服务器方法会抛出重复的键错误,因为找不到用户。典型的查询是:{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 dev环境中完美运行,但在我的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 :(得分:14)
那些是不同的MongoDB查询,你肯定想要切换到的点缀式。请参阅Mongo Dot Notation文档。
Meteor.users.find({"services.facebook.id": "foo"})
将返回具有您要查找的嵌入属性的任何文档,其值为foo
。
Meteor.users.find({services: {facebook: {id: "foo"}}})
仅匹配完全该结构的文档。如果嵌入的facebook文档有其他字段,则不匹配。生产数据库中的文档可能包含更多字段,因此您无法获得匹配。