2014-06-18 132 views
2

我无法确定如何更新MongoDB集合中的条目。我看了一下C#驱动程序docs,我想我已经非常仔细地跟着他们了。更新MongoDB集合中的条目

但是,我传递给Update方法的一个参数(或者两个?)是无效的。谁能告诉我我做错了什么?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using MongoDB.Bson; 
using MongoDB.Bson.Serialization.Attributes; 
using MongoDB.Driver; 
using MongoDB.Driver.Linq; 


namespace Csharp_Linq 
{ 
    class Program 
    { 
     public class Book 
     { 
      // Fields 
      public string title { get; set; } 
      public string author { get; set; } 
      public ObjectId id { get; set; } 

      // Constructors 
      public Book() 
      { 
       this.title = "some title"; 
       this.author = "some author"; 
      } 

      public Book(string title, string author) 
      { 
       this.title = title; 
       this.author = author; 
      } 

     } 

     static void Main(string[] args) 
     { 
      // Connect to the server 
      string connectionString = "mongodb://localhost"; 
      MongoClient client = new MongoClient(connectionString); 
      MongoServer server = client.GetServer(); 

      // Get the database then the collection 
      MongoDatabase database = server.GetDatabase("tutorial"); 
      MongoCollection collection = database.GetCollection("books"); 

      // Query the collection 
      int count = 
       (from book in collection.AsQueryable<Book>() 
       select book) 
       .Count(); 

      string numBooks = String.Format("This collection has {0} books.", count); 
      Console.WriteLine(numBooks); 

      var query = 
       from book in collection.AsQueryable<Book>() 
       where book.author == "Ernest Hemingway" 
       select book; 

      foreach (var book in query) 
      { 
       string bookInfo = String.Format("{0} by {1}", book.title, book.author); 
       Console.WriteLine(bookInfo); 
      } 

      // Insert new books 
      Book scaryBook = new Book("Dr. Sleep", "Stephen King"); 
      Book[] batch = 
      { 
       new Book(), 
       scaryBook 
      }; 
      collection.InsertBatch(batch); 

      // Update default book 
      var query2 = 
       from book in collection.AsQueryable<Book>() 
       where book.title == "some title" && book.author == "some author" 
       select book; 

      var update = new UpdateDocument { 
       { "$set", new BsonDocument("title", "War and Peace") } 
      }; 
      BsonDocument updatedBook = collection.Update(query2, update); 

      Console.ReadLine(); 
     } 
    } 
} 

我有点惊讶,Update方法实际上返回一个BsonDocument。它为什么这样做?

早些时候,我试图用更新对象作为示例所示:

MongoCollection<BsonDocument> books; 
var query = Query.And(
    Query.EQ("author", "Kurt Vonnegut"), 
    Query.EQ("title", "Cats Craddle") 
); 
var update = Update.Set("title", "Cat's Cradle"); 
BsonDocument updatedBook = books.Update(query, update); 

这是否对象还存在吗?每当我将它输入到Visual Studio中时,我都会收到一个错误,提示该对象不在名称空间中。

回答

0

Update对象是MongoDB.Driver.Builders命名空间的一部分,虽然这在本教程中并不明显。

认为问题出在您的查询上。除非你有书

book.title == "some title" && book.author == "some author" 

你不会找到任何更新。

如果将此代码添加到代码文件中,您将成为第二个示例(一次)。

using MongoDB.Driver.Builders; 
2

首先,我必须包括

using MongoDB.Driver.Builders; 

然后,我有我的Linq查询转换为蒙戈查询。这里是由此产生的代码:

 // Update default book 
     var query2 = 
      from book in collection.AsQueryable<Book>() 
      where book.title == "some title" && book.author == "some author" 
      select book; 
     // Cast linq query to Mongo query 
     var mongoQuery = ((MongoQueryable<Book>)query2).GetMongoQuery(); 

     var update = new UpdateDocument { 
      { "$set", new BsonDocument("title", "War and Peace") } 
     }; 
     collection.Update(mongoQuery, update); 

花了一点研究,让所有的作品适合!

+0

CASTIN LINQ查询到蒙戈帮助了我很多。谢谢。 – miksiii

0

您可以通过以下方式更新条目。以项目的情况下添加到购物车

db.carts.update({ 
_id: "the_users_session_id", status:'active' 
}, { 
$set: { modified_on: ISODate() }, 
$push: { 
    products: { 
    sku: "111445GB3", quantity: 1, title: "Simsong One mobile phone", price:1000 
    } 
} 
}); 

请参考下面的更多信息http://advancedmongodb.blogspot.in/