C# MongoDb 驱动问题 Update Failing

标签 c# mongodb

情况是这样的。我正在插入一个新帖子,插入后我获取该帖子并且它工作正常。然后我更改一个字段并更新它工作正常。当我尝试在更新后获取相同的帖子时出现问题。它总是返回空值。

     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"] 的新文档。不幸的是,这不起作用,并且出于某种原因,它要求您发送与 persistedPost 更新关联的 _id,您将在更新命令后获得该更新。这是示例:

 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"] 而不是文档字段。这似乎工作正常。我猜它为每个“_id”字段生成的 24 字节代码是不同的。

最佳答案

答案是不要依赖 MongoDb 生成的“_id”。只需使用您自己的唯一标识符,如 Guid 或身份。

更新:

我的 ToDocument 方法将 _id 作为字符串,您必须始终将 _id 作为 Oid。

关于C# MongoDb 驱动问题 Update Failing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337718/

相关文章:

c# - 嵌套数组属性上的 Mongo C# 强类型索引

mongodb - 如何分组 mongodb - mapReduce 输出?

c# - 从 asp 页面调用 C# 函数

c# - 查找哪个事件被触发

c# - 验证值存储在我的 Web.config 文件中的位置

java - MongoRepository findByCreatedAtBetween 没有返回准确的结果

python - 如何为 python 单元测试模拟 mongodb?

c# - 仅使用按钮和网格重新创建标签页 - WPF C#

c# - "return this"在 C# 中使用构建器的子类型

mongodb - mongoid 中的排序和分组