Ошибка обновления драйвера C # MongoDb

2

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

     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, которое вы получите после команды обновления. Вот пример:

 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);

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

Теги:

1 ответ

0
Лучший ответ

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

ОБНОВЛЕНИЕ:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню