MongoDB C # Драйвер FindAndModify - PullRequest
2 голосов
/ 03 октября 2011

Я пытаюсь запустить операцию FindAndModify в MongoDB, но получаю необычное исключение

var query = Query.EQ("_id", wiki.ID);
var sortBy = SortBy.Descending("Version");
var update = Update.Set("Content", wiki.Content)
                    .Set("CreatedBy", wiki.CreatedBy)
                    .Set("CreatedDate", wiki.CreatedDate)
                    .Set("Name", wiki.Name)
                    .Set("PreviousVersion", wiki.PreviousVersion.ToBsonDocument())
                    .Set("Title", wiki.Title)
                    .Set("Version", wiki.Version);
var result = collection.FindAndModify(query, sortBy, update, true);

Исключение, которое я получаю:

WriteStartArray can only be called when State is Value, not when State is Initial
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: WriteStartArray can only be called when State is Value, not when State is Initial

Source Error:

Line 45:                 var query = Query.EQ("_id", wiki.ID);
Line 46:                 var sortBy = SortBy.Descending("Version");
Line 47:                 var update = Update.Set("Content", wiki.Content)
Line 48:                                    .Set("CreatedBy", wiki.CreatedBy)
Line 49:                                    .Set("CreatedDate", wiki.CreatedDate)

Мысли?Я реализовал это в соответствии с API на сайте mongodb.

EDIT-- Исправлено per @ jeffsaracco

var update = Update.Set("Content", wiki.Content)
.Set("CreatedBy", wiki.CreatedBy)
.Set("CreatedDate", wiki.CreatedDate)
.Set("Name", wiki.Name)
.PushAllWrapped<WikiHistory>("PreviousVersion", wiki.PreviousVersion)
.Set("Title", wiki.Title)
.Set("Version", wiki.Version);

Ответы [ 4 ]

2 голосов
/ 05 октября 2011

Ваше решение с PushAllWrapped может быть, а может и не хотеть, что вы хотите.Он отличается от Set, поскольку добавляет новые значения к текущему значению массива.Если вы хотите заменить существующее значение массива новым значением массива, вы можете использовать эту версию Set:

var update = Update.Set("Content", wiki.Content)
    // other lines
    .Set("WikiHistory", new BsonArray(BsonDocumentWrapper.CreateMultiple(wiki.PreviousVersion);

, которая гласит: установите значение элемента WikiHistory в новый BsonArray, созданный путем сериализации обернутогозначения пользовательского типа PreviousVersion.

1 голос
/ 04 октября 2011

Является ли один из ваших столбцов типом массива? Если это так, вы можете позвонить

Update.Push

OR

Update.PushAll

для этого столбца, и если PreviousVersion уже является BsonDocument, вам, вероятно, не нужно снова преобразовывать

0 голосов
/ 06 октября 2011

В итоге, так как я просто отслеживаю историю объекта, я в итоге использовал .AddToSetWrapped<WikiHistory>("PreviousVersion", CurrentVersion), который просто добавляет элемент к набору в объекте.

0 голосов
/ 04 октября 2011

Вы уверены в своем SortBy.Descending?

API не указывает, что вы можете использовать что-то другое, кроме string [], в качестве параметра (http://api.mongodb.org/csharp/current/html/96408b4e-c537-0772-5556-6f43805dd4d4.htm)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...