在服务器上查找Meteor用户

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)

我刚刚通过这种格式化查询的方式使其工作起来了:{"services.facebook.id": "xxxx"}。似乎嵌套太深了。我在服务器上使用node-inspector尝试了各种查询,并发现嵌套3层的查询总是返回未定义。仍然不清楚为什么深度嵌套在OSX上可以工作,但在Linux上失败了。 - Jeremy Dunn
1个回答

14

这些是不同的 MongoDB 查询,你肯定想要切换到点样式。请参阅Mongo Dot Notation文档。

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

将返回任何具有您要查找的嵌入属性且值为foo的文档。

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

只匹配具有完全相同结构的文档。如果嵌入式Facebook文档具有其他字段,则不会匹配。您的生产数据库中的文档可能具有更多字段,因此您无法获得匹配项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接