SafeModeResult является нулевым после обновления - PullRequest
5 голосов
/ 22 февраля 2012

Используя MongoDB и последний драйвер 10gen C # (CSharpDriver-1.3.1.4349), я пытаюсь выполнить обновление «на месте» и вернуть количество документов, полученных в результате.

public static long SaveListings(string state, bool isActive, DateTime updateDate)
{
    var result = Collection().Update(
    Query.And(
        Query.EQ("State", state), 
        Query.And(
            Query.EQ("IsActive", isActive),
            Query.LT("UpdateDate", updateDate))),
    Update.Set("IsActive", false), UpdateFlags.Multi);
    return result != null ? result.DocumentsAffected : -1;
}

По какой-то причине результат нулевой.Если бы я делал это из консоли, я мог бы получить количество строк, выполнив это:

db.Listing.update( { State: state.Abbreviation, IsActive: true, UpdateDate: { $lt: expiredDate } }, { $set: { IsActive: false } }, false, true);
var numRows = db.getLastErrorObj().n;

Есть идеи, что я делаю неправильно, или это ошибка в драйвере C #?

Ответы [ 3 ]

6 голосов
/ 22 февраля 2012

Обновление содержит перегруженный метод, который принимает SafeMode. Просто добавьте его в свой код в качестве четвертого параметра в вашем обновлении, и оно должно быть не нулевым:

...
UpdateFlags.Multi,
SafeMode.True);

Это не ошибка драйвера, она работает как положено. Mongodb не ожидает документ, если его вставить без безопасного режима (поэтому драйвер возвращает null), но если вы говорите SafeMode = true - вы заставляете mongodb ждать, пока документ не будет вставлен.

4 голосов
/ 22 февраля 2012

Выполнение вставок и обновлений без указания безопасного режима приводит к нулю, поскольку они являются асинхронными операциями - просто невозможно узнать, как прошла вставка или обновление.

Поэтому добавьте, например, SafeMode.True в качестве последнего аргумента во вставках и обновлениях в тех случаях, когда вы заботитесь о результате. Это заставит драйвер выдавать команду getLastError, которая блокирует до завершения вставки / обновления:

var result = collection.Update(query, update, SafeMode.True);

Вы можете прочитать больше о getLastError и различных безопасных режимах здесь (общие сведения) и здесь (SafeMode с драйвером C #) .

0 голосов
/ 22 февраля 2012

Попробуйте getLastError здесь: http://www.webtropy.com/articles/art9-1.asp?f=GetLastError

...