如何在 MongoDB .Net 中插入文档?
How to upsert a document in MongoDB .Net?
我正在添加一个 UpdateCustomer
方法,该方法将修改后的客户传递到数据库中。但是我在更新文档上调用 ReplaceOneAsync
时遇到错误。
我参考了以下 example and api reference,其中都声明要传递 ReplaceOneAsync
一个 filter
和 document
参数。
但由于参数不正确而抛出具体错误,如下所述:
Error 1 The best overloaded method match for 'MongoDB.Driver.IMongoCollection<MongoDBApp.Models.CustomerModel>.ReplaceOneAsync(MongoDB.Driver.FilterDefinition<MongoDBApp.Models.CustomerModel>, MongoDBApp.Models.CustomerModel, MongoDB.Driver.UpdateOptions, System.Threading.CancellationToken)' has some invalid arguments
Error 2 Argument 2: cannot convert from 'MongoDB.Bson.BsonDocument' to 'MongoDBApp.Models.CustomerModel'
有人对理解错误有任何提示吗?
UpdateCustomer
方法:
public async Task UpdateCustomer(CustomerModel customer)
{
var collection = StartConnection();
var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id);
BsonDocument doc = new BsonDocument();
doc["_id"] = customer.Id;
doc["firstName"] = customer.FirstName;
doc["lastName"] = customer.LastName;
doc["email"] = customer.Email;
//error thrown here on the ReplaceOneAsync params..
await collection.ReplaceOneAsync(filter, doc);
}
以及关联的 StartConnection 方法:
private static IMongoCollection<CustomerModel> StartConnection()
{
var client = new MongoClient(connectionString);
var database = client.GetDatabase("orders");
//Get a handle on the customers collection:
var collection = database.GetCollection<CustomerModel>("customers");
return collection;
}
您需要一直使用类型化集合,这意味着插入 CustomerModel
的实例,而不是 BsonDocument
:
await collection.ReplaceOneAsync(filter, customer);
或者使用无类型的 BsonDocument
,但从一开始就这样做:
var collection = database.GetCollection<BsonDocument>("customers");
您会收到这些编译错误,因为您混合使用了这两个选项。
这对我有用
var filter = Builders.Filter.Where(x => x.Id == customer.Id);
await Collection.ReplaceOneAsync(filter, item, new ReplaceOptions { IsUpsert = true });
我正在添加一个 UpdateCustomer
方法,该方法将修改后的客户传递到数据库中。但是我在更新文档上调用 ReplaceOneAsync
时遇到错误。
我参考了以下 example and api reference,其中都声明要传递 ReplaceOneAsync
一个 filter
和 document
参数。
但由于参数不正确而抛出具体错误,如下所述:
Error 1 The best overloaded method match for 'MongoDB.Driver.IMongoCollection<MongoDBApp.Models.CustomerModel>.ReplaceOneAsync(MongoDB.Driver.FilterDefinition<MongoDBApp.Models.CustomerModel>, MongoDBApp.Models.CustomerModel, MongoDB.Driver.UpdateOptions, System.Threading.CancellationToken)' has some invalid arguments
Error 2 Argument 2: cannot convert from 'MongoDB.Bson.BsonDocument' to 'MongoDBApp.Models.CustomerModel'
有人对理解错误有任何提示吗?
UpdateCustomer
方法:
public async Task UpdateCustomer(CustomerModel customer)
{
var collection = StartConnection();
var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id);
BsonDocument doc = new BsonDocument();
doc["_id"] = customer.Id;
doc["firstName"] = customer.FirstName;
doc["lastName"] = customer.LastName;
doc["email"] = customer.Email;
//error thrown here on the ReplaceOneAsync params..
await collection.ReplaceOneAsync(filter, doc);
}
以及关联的 StartConnection 方法:
private static IMongoCollection<CustomerModel> StartConnection()
{
var client = new MongoClient(connectionString);
var database = client.GetDatabase("orders");
//Get a handle on the customers collection:
var collection = database.GetCollection<CustomerModel>("customers");
return collection;
}
您需要一直使用类型化集合,这意味着插入 CustomerModel
的实例,而不是 BsonDocument
:
await collection.ReplaceOneAsync(filter, customer);
或者使用无类型的 BsonDocument
,但从一开始就这样做:
var collection = database.GetCollection<BsonDocument>("customers");
您会收到这些编译错误,因为您混合使用了这两个选项。
这对我有用
var filter = Builders.Filter.Where(x => x.Id == customer.Id);
await Collection.ReplaceOneAsync(filter, item, new ReplaceOptions { IsUpsert = true });