2012-03-11 2 views
1

Я использую MongoDB на моем site.When я пытаюсь запустить функцию «findAndModify» Я всегда получаю, что документ является «неопределенным»:Использование «findAndModify» на MongoDB

function counter(name) { 
    var doc = this.db.collection('counter').findAndModify(
       { query: { _id: name }, 
        update: { $inc: { next: 1} }, 
        new: true, 
        upsert: true }); 

    return doc.next; 
} 

Q: Что я упускаю ?

+0

Какой выпуск MongoDB вы используете в настоящее время и с каким драйвером? Каковы ваши результаты, если вы попробуете это через оболочку? – Bill

+0

Я использую 2.0.3. Если я проверяю в оболочке, он работает – user541847

ответ

1

Вы ничего не пропустили, с upsert равным true findAndModify должен всегда возвращать документ. Даже если совпадений нет по запросу.

Но есть ограничения с помощью sharding и findAndModify - ваш запрос всегда должен содержать ключ осколка, mb это проблема.

Также эта команда доступна для mongodb с версией> = 1.3. Если вы используете старый mongodb, просто обновите его до последней версии (2.0.3), и он должен работать. (Я тестировал на 1,8 и 2,0)

2

У меня была эта проблема, пытающаяся реализовать тот же код образца счетчика из документов MongoDB.

Если вы используете драйвер mongojs вам нужно использовать функцию обратного вызова, как эта функция не возвращает ничего:

this.db.collection('counter').findAndModify({ 
    query: { _id: name }, 
    update: { $inc: { next: 1} }, 
    new: true, 
    upsert: true 
    }, 
    function(err, doc){ 
     console.log('the id is: '+doc.next); 
    }); 
-3

Поссорившись мою голову в течение довольно долгого времени я изменю своего рода 1, и это работало .....

counters.findAndModify({ _id: { $eq: "virtualcurrency" } }, { '_id': 1 }, { $inc: { seq: 1 } }, { new: true }, function (err, result) { 
+0

Пожалуйста, объясните, как это решает проблему, описанную в вопросе. – nabinca

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