2013-09-14 6 views
2

У меня есть модель с массивом встроенных документов.

var CourseSchema = mongoose.Schema({ 
     invitations: [InvitationSchema], 
     total:Number 
}); 

var InvitationSchema = new mongoose.Schema({ 
    token: { type:String, required: true}, 
    email: String 
}); 

хочет обновить/увеличить общее количество приглашения пути сопоставления маркера приглашения встроенного массива из запроса, здесь я последовал за учебник в http://diogogmt.wordpress.com/2012/03/23/update-elementmatch-and-the-positional-operator-on-mongodbmongoose/

поэтому я попытался

var options = { new: false , select:'_id'}; 
CourseModel.update({'_id':id,'invitations':{'$elemMatch':{'token':token}}},{'$inc':{'total':1}},options,function(err,data) { 
    if(err){callback(err, null);} 
    else{ 
     callback(null, data); 
    }  
}) 

Но это не сработает, если я удалю «приглашения»: {'$ elemMatch': {'token': токен}}, запрос будет работать

+0

Это работало нормально, когда я попробовал. Что не работает над тем, что вы пытаетесь? – JohnnyHK

+0

Я пробовал на раковине манго, работает также. Я думаю, что мангуста не работает по какой-то причине. Я проверяю, в чем проблема сейчас. – user824624

ответ

1

Согласно documentation $ elemMatch может использоваться только для проекции. Но я нашел example, которые иллюстрируют использование $ elemMatch в сочетании с $ all. Попробуйте это.

1) Я создал документ в коллекции следующими способами:

db.testColl.insert({count:0,arr:[{token:'xya'},{token:'xyb'},{token:'xyc'},{token:'xyd'},{token:'xye'}]}) 

2), то я использую найти команду без

db.testColl.find() 

Выход:

{ "_id" : ObjectId("52345478ef5f122b1c9c54be"), "count" : 0, "arr" : [ { "token" : "xya" }, { "token" : "xyb" }, { "token" : "xyc" }, { "token" : "xyd" }, { "token" : "xye" } ] } 

3) затем я запускаю следующую команду последовательно:

db.testColl.update({arr:{$elemMatch:{token:'xya'}}},{'$inc':{'count':1}}) 
db.testColl.update({arr:{$elemMatch:{token:'xyb'}}},{'$inc':{'count':1}}) 
db.testColl.update({arr:{$elemMatch:{token:'xyc'}}},{'$inc':{'count':1}}) 
db.testColl.update({arr:{$elemMatch:{token:'xyd'}}},{'$inc':{'count':1}}) 
db.testColl.update({arr:{$elemMatch:{token:'xye'}}},{'$inc':{'count':1}}) 

4) Теперь, db.testColl.find() дает мне право выход, который требуется:

{ "_id" : ObjectId("52345478ef5f122b1c9c54be"), "count" : 5, "arr" : [ { "token" : "xya" }, { "token" : "xyb" }, { "token" : "xyc" }, { "token" : "xyd" }, { "token" : "xye" } ] } 

Итак, ваш запрос, кажется, будет хорошо !!!

+0

http://docs.mongodb.org/manual/reference/operator/elemMatch/#op._S_elemMatch, если вы видите это, $ elementMatch может также использоваться для запроса – user824624

+0

Да, вы правы которые также могут использоваться для запросов. Но он возвращает весь документ, если он соответствует любому токену в приглашениях массива? Это то же самое, что вы хотели? можете ли вы упомянуть любой пример, какой должен быть результат в самом вопросе? –

+1

есть два элемента в InvictSchema, которые являются токеном и электронной почтой, поэтому, конечно, должно быть много приглашений отправлено, когда клиент принимает приглашение, токен предоставляется в Интернете, база данных проверяет, находится ли этот токен в список приглашений. если он находится в одном из списков, он увеличит общее количество принятых клиентов - это «общий» элемент в CourseSchema. Все, что я хочу, это просто обновить документ, если соответствие выполнено, а не возвращенный документ. – user824624

Смежные вопросы