#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 /