2012-11-05 4 views
7

다음 서버 메소드는 사용자를 찾을 수 없기 때문에 중복 키 오류가 발생합니다. 일반적인 쿼리는 다음과 같습니다 {서비스 : {페이스 북 : {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 

그것은 나의 이해입니다 서버 방법이 왜 사용자를 찾을 수없는 것입니다 컬렉션에있는 모든 문서에 액세스 할 수 삽입이 중복 페이스 북 ID로 인해 실패합니까?

이것은 내 osx 개발 환경에서 완벽하게 작동하지만 내 우분투 서버 (번들)에서는 작동하지 않으며 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"} 중첩이 너무 심해 보입니다. 노드 관리자를 사용하여 서버에서 다양한 쿼리를 시도해 보았을 때 중첩 된 3 개의 쿼리가 항상 정의되지 않은 값으로 반환된다는 것을 알았습니다. 깊은 중첩이 OSX에서 작동하고 Linux에서 실패하는 이유는 아직 명확하지 않습니다. –

답변

14

사람들은 다른 MongoDB의 쿼리, 그리고 당신은 확실히 당신이 전환 점선 스타일을 원한다. Mongo Dot Notation 설명서를 참조하십시오.

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

는 값 foo으로 찾고있는 임베디드 속성이 문서를 반환합니다.

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

정확히 그 구조의 문서와 일치합니다. 포함 된 페이 스북 문서에 다른 필드가 있으면 일치하지 않습니다. 프로덕션 DB의 문서에 필드가 많아서 일치하지 않을 가능성이 큽니다.