Обновление записи в коллекции MongoDB

#c# #mongodb

#c# #mongodb

Вопрос:

Я не могу понять, как обновить запись в моей коллекции 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" amp;amp; 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, я получаю сообщение об ошибке, в котором говорится, что объект отсутствует в пространстве имен.

Ответ №1:

Сначала я должен был включить

 using MongoDB.Driver.Builders;
  

Затем мне пришлось преобразовать мой запрос Linq в запрос Mongo. Вот результирующий код:

         // Update default book
        var query2 =
            from book in collection.AsQueryable<Book>()
            where book.title == "some title" amp;amp; 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);
  

Потребовалось небольшое исследование, чтобы привести все части в соответствие!

Комментарии:

1. Приведение запроса linq в Mongo мне очень помогает. Спасибо.

Ответ №2:

Объект обновления является частью MongoDB.Driver.Пространство имен Builders, хотя это не очевидно из руководства.

Думаю, проблема связана с вашим запросом. Если только у вас нет книги с

  book.title == "some title" amp;amp; book.author == "some author"
  

вы не найдете ничего, что можно было бы обновить.

Ваш второй пример будет работать (один раз), если вы добавите это в свой файл кода.

 using MongoDB.Driver.Builders;
  

Ответ №3:

Вы можете обновить запись, выполнив следующие действия. Возьмем пример добавления товара в корзину

 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 /