2010-02-25 6 views
2

Voici la situation. Je suis en train d'insérer un nouveau message et après insertion, je vais chercher le message et cela fonctionne très bien. Ensuite, je change un champ et mise à jour qui fonctionne bien. Le problème se produit lorsque j'essaie d'extraire le même message après la mise à jour. Il retourne toujours nul.C# MongoDb Driver Question Mise à jour

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

MISE À JOUR:

Je pense avoir résolu le problème, mais la question est très bizarre. Voir la dernière ligne

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

La méthode FindOne prend un nouveau document qui dépend du document ["_ id"]. Malheureusement, cela ne fonctionne pas et pour une raison quelconque, il vous faut envoyer la _id associée à la mise à jour persistedPost que vous obtiendrez après la commande de mise à jour. Voici l'exemple:

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

Voyez, maintenant j'envoie le document2 ["_ id"] à la place du champ de document. Cela semble fonctionner correctement. Je suppose que le code de 24 octets qu'il génère pour chaque champ "_id" est différent.

Répondre

0

La réponse est de ne pas compter sur le "_id" généré par MongoDb. Utilisez simplement votre propre identifiant unique comme Guid ou Identity.

MISE À JOUR:

Ma méthode de audocument mettais la _id sous forme de chaîne, vous devez toujours mettre _id OID.

Questions connexes