在MongoDB集合中更新条目

4

我无法弄清如何更新 MongoDB 集合中的条目。我已经查看了 C# 驱动程序的文档(链接),而且我认为我已经非常密切地遵循了它们。

然而,我传递给 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。为什么会这样?
之前,我尝试使用如下示例中的Update对象:
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中打入它时,都会出现一个错误,说该对象不在命名空间中。

3个回答

2

首先我必须包含

using MongoDB.Driver.Builders;

然后我不得不将我的Linq查询转换为Mongo查询。 这是最终的代码:

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

需要进行一些研究才能使所有的部分组合在一起!

将linq查询转换为Mongo对我帮助很大。谢谢。 - 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/

0

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

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

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

你不会找到任何需要更新的内容。

如果将以下代码添加到您的代码文件中,您的第二个示例将起作用(一次)。

using MongoDB.Driver.Builders;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接