Ошибка обновления драйвера C # MongoDb - PullRequest
2 голосов
/ 26 февраля 2010

Вот ситуация. Я вставляю новый пост, а после вставки извлекаю пост, и он работает нормально. Затем я изменяю одно поле и обновляю, который работает нормально. Проблема возникает, когда я пытаюсь получить тот же пост после обновления. Всегда возвращает ноль.

     public class Post
        {
            public string _id { get; set; }
            public string Title { get; set; }
            public string Body { get; set; }
        }

 // insert a post 
        var post = new Post() {Title = "first post", Body = "my first post"};
        var posts = _db.GetCollection("posts");
        var document = post.ToDocument();

        // inserts successfully! 
        posts.Insert(document);

        // now get the post 
        var spec = new Document() {{"_id", document["_id"]}};

        // post was found success
        var persistedPost = posts.FindOne(spec).ToClass<Post>();

        persistedPost.Body = "this post has been edited again!!";
        var document2 = persistedPost.ToDocument(); 
        // updates the record success although I don't want to pass the second parameter
        posts.Update(document2,spec);

        // displays that the post has been updated
        foreach(var d in posts.FindAll().Documents)
        {
            Console.WriteLine(d["_id"]); 
            Console.WriteLine(d["Body"]);
        }

    // FAIL TO GET THE UPDATED POST. THIS ALWAYS RETURNS NULL ON FindOne call! 
    var updatedPost = posts.FindOne(new Document() {{"_id",document["_id"]}}).ToClass<Post>(); // this pulls back the old record with Body = my first post
    Assert.AreEqual(updatedPost.Body,persistedPost.Body);

ОБНОВЛЕНИЕ:

Я думаю, что решил проблему, но проблема очень странная. Смотрите последнюю строку.

var updatedPost = posts.FindOne(new Document() {{"_id",document["_id"]}}).ToClass<Post>();

Метод FindOne принимает новый документ, который зависит от документа ["_ id"]. К сожалению, это не работает и по какой-то причине требует отправки _id, связанного с обновлением persistedPost, которое вы получите после команды update. Вот пример:

 var persistedPost = posts.FindOne(spec).ToClass<Post>();
            persistedPost.Body = "this is edited";
            var document2 = persistedPost.ToDocument(); 
            posts.Update(document2,new Document() {{"_id",document["_id"]}});

            var updatedPost = posts.FindOne(new Document(){{"_id",document2["_id"]}}).ToClass<Post>(); 
            Console.WriteLine(updatedPost.Body);

Смотрите, теперь я отправляю document2 ["_ id"] вместо поля документа. Кажется, это работает правильно. Я предполагаю, что 24-байтовый код, который он генерирует для каждого поля "_id", отличается.

1 Ответ

0 голосов
/ 26 февраля 2010

Ответ заключается в том, что нельзя полагаться на _id, сгенерированный MongoDb. Просто используйте свой уникальный идентификатор, такой как Guid или личность.

ОБНОВЛЕНИЕ:

Мой метод ToDocument помещал _id как строку, которую вы всегда должны указывать _id как Oid.

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