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.