2016-03-24 2 views
2

Bir meteor uygulamasına sahibim ve bir mongo belgesini sunucu tarafındaki konumsal işleçle güncellemek istiyorum. Ayrıca voted değerini arttırmak istiyorum.

{ 
    _id: "yBonLeLPTcffxJwY9", 
    endDate: "someDate", 
    name: "Foo", 
    options: [ 
     { 
     name: "bar", 
     voted: 1, 
     usersId: ["yBonLeLPTczzaJwY9"] 
     } 
    ] 
} 

Ve benzeri benim güncelleme isteği görünüyor:

Benim Mongo belge benziyor ben bu hata mesajını aldım

Votes.update({ 
     _id: mongoId, 
     'options.name': voteName 
    }, { 
     $inc: {'options.$.voted': 1}, 
     $push: {'options.$': {usersId: userId}} 
    }); 

:

MongoError: The field 'options.1' must be an array but is of type Object in document {_id: "yBonLeLPTcffxJwY9"}

birkaç forumlarında buldum Minimongo'da konumsal operatörün kullanımını ve artan değeri etkileyen bir sınırlama vardır.

cevap

0

Hata size doğru olanı anlattı. Düz bir üye değil, bir "belge" eklediniz. Yani sözdizimi biraz farklıdır:

Votes.update({ 
     _id: mongoId, 
     'options.name': voteName 
    }, { 
     $inc: {'options.$.voted': 1}, 
     $push: {'options.$.usersId': userId} 
    }); 

Yani $push ile eklemek istediğiniz diziye "nokta gösterimde" tam iç alanını referans. Bu, hatayı giderir.

ben de bir "oylama" sisteminde yerine kontrol edilmesi gerektiğini önerebilir ilk giriş için usersId dizi:

Votes.update({ 
     _id: mongoId, 
     'options.name': voteName, 
     'options.usersId': { '$ne': userId } 
    }, { 
     $inc: {'options.$.voted': 1}, 
     $push: {'options.$.usersId': userId} 
    }); 

olarak gelmiştir birisi bir oylama gönderdiğinde artmaz senin $inc Bu şekilde Yine, onlar zaten orada olduklarında diziye eklenirler.