2012-11-05 20 views
7

Aşağıdaki sunucu yöntemi, kullanıcılar bulunamadığından yinelenen anahtar hataları atıyor. Tipik bir sorgu şöyledir: {hizmetleri: {facebook: {id: 'XXXX'}}}Sunucuda bir meteor kullanıcısı bulma

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 

Benim anlayış sunucu yöntemleri öyleyse neden kullanıcı bulundu olmaz koleksiyonlarında tüm belgelere erişimi olduğundan ancak yinelenen facebook kimliği nedeniyle insert başarısız mı?

Bu, osx dev ortamımda mükemmel çalışır ancak ubuntu sunucumda (birlikte) çalışır ve NODE_ENV = üretimiyle çalışır. İşte

ölçüm değeridir:

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

Sorunu şu şekilde biçimlendirerek çalışıyorum: {"services.facebook.id": "xxxx"} Yuvalama çok derinmiş gibi görünüyor. Düğüm denetçisi kullanarak sunucuda çeşitli sorgular denedim ve 3 derin iç içe geçmiş sorguların her zaman yeniden tanımlanmadığını buldum. Derin yuvalamanın OSX'de neden işlediğine ve Linux'ta başarısızlığa neden olduğu hala net değil. –

cevap

14

olanlar farklı MongoDB sorguları vardır ve kesinlikle geçiş noktalı tarzı istiyorum. Mongo Dot Notation belgelerine bakın.

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

Eğer değeri foo ile aradığınız gömülü özelliği olan herhangi bir belge dönecektir.

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

sadece tam o yapıyla belgeleri eşleşir. Gömülü facebook belgesinin başka alanları varsa, eşleşmez. Üretim DB'nizdeki belgenin daha fazla alana sahip olması ve böylece bir eşleşme elde etmemesi olasıdır.