public class MongoDbRepository<T> : IRepository<T> where T : IEntityBase
{
private IMongoDatabase database;
private IMongoCollection<T> collection;
public MongoDbRepository()
{
GetDatabase();
GetCollection();
}
private void GetDatabase()
{
var client = new MongoClient(GetConnectionString());
database = client.GetDatabase(GetDatabaseName());
}
private void GetCollection()
{
collection = database.GetCollection<T>(typeof(T).Name);
}
private string GetDatabaseName()
{
return ConfigurationManager.AppSettings.Get("MongoDbDatabaseName");
}
private string GetConnectionString()
{
return ConfigurationManager.AppSettings.Get("MongoDbConnectionString").Replace("{DB_NAME}", GetDatabaseName());
}
public async Task<IList<T>> SelectAllSync()
{
//Add _id that is unique for each document
var filter = new BsonDocument("_id", new BsonDocument("$exists", true));
var people = await collection.Find<T>(filter).ToListAsync<T>();
//Search methods
var result1 = await database.GetCollection<T>(typeof(T).Name)
.Aggregate()
.Match(x => x.last_name.Equals("Hall")).ToListAsync();
var result2 = collection.FindAsync<T>(Builders<T>
.Filter.Eq(x => x.last_name, "Grammer")
, new FindOptions<T> { Comment = "TEST" }
, CancellationToken.None);
var result3 = await collection.FindAsync<T>(
Builders<T>.Filter.Eq("dealership_name", "D-PATRICK NISSAN"),
new FindOptions<T> { Comment = "TEST" },
CancellationToken.None);
return (IList<T>)people;
}
public Task Insert(T entity)
{
var result = collection.InsertOneAsync(entity);
return result;
}
public async Task<DeleteResult> Delete(T entity)
{
var deleteResult = await collection.DeleteOneAsync(Builders<T>.Filter.Eq(s => s._id, entity._id));
return deleteResult;
}
public async Task<IList<T>> SearchFor(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
var result = await database.GetCollection<T>(typeof(T).Name)
.Aggregate()
.Match(predicate).ToListAsync();
return result;
}
public async Task<IList<T>> GetById(ObjectId id)
{
var result = await database.GetCollection<T>(typeof(T).Name)
.Aggregate()
.Match(x => x._id.Equals(id)).ToListAsync();
return result;
}
public async Task<UpdateResult> Update(T entity)
{
if (entity._id == null)
await Insert(entity);
//添加了dealer_code
的字符串值列表
var list = new List<string>();
list.Add("dealer_code");
var result = await collection.UpdateOneAsync(
Builders<T>.Filter.Eq(s => s.dealer_code, entity.dealer_code),
Builders<T>.Update.AddToSet(list[0], entity.dealer_code)
);
return result;
}
}
我有Update方法的问题。它给了我:
“字段
'dealer_code'
的序列化程序必须实现IBsonArraySerializer
并提供项目序列化信息。”
这是什么意思?我该如何解决这个问题?
答案 0 :(得分:1)
public class MongoDbRepository<T> : IRepository<T> where T : IEntityBase
{
private IMongoDatabase database;
private IMongoCollection<T> collection;
public MongoDbRepository()
{
GetDatabase();
GetCollection();
}
private void GetDatabase()
{
var client = new MongoClient(GetConnectionString());
database = client.GetDatabase(GetDatabaseName());
}
private void GetCollection()
{
collection = database.GetCollection<T>(typeof(T).Name);
}
private string GetDatabaseName()
{
return ConfigurationManager.AppSettings.Get("MongoDbDatabaseName");
}
private string GetConnectionString()
{
return ConfigurationManager.AppSettings.Get("MongoDbConnectionString").Replace("{DB_NAME}", GetDatabaseName());
}
public async Task<IList<T>> SelectAllSync()
{
//var filter = new BsonDocument("dealer_code", new BsonDocument("$exists", true));
//var people = await collection.Find<T>(filter).ToListAsync<T>();
//Search methods
var result1 = await database.GetCollection<T>(typeof(T).Name)
.Aggregate()
.Match(x => x.last_name.Equals("Hall")).ToListAsync();
var result2 = collection.FindAsync<T>(Builders<T>
.Filter.Eq(x => x.last_name, "Grammer")
, new FindOptions<T> { Comment = "TEST" }
, CancellationToken.None);
return (IList<T>)result1;
}
public Task Insert(T entity)
{
var result = collection.InsertOneAsync(entity);
return result;
}
public async Task<DeleteResult> Delete(T entity)
{
var deleteResult = await collection.DeleteOneAsync(Builders<T>.Filter.Eq(s => s._id, entity._id));
return deleteResult;
}
public async Task<IList<T>> SearchFor(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
var result = await database.GetCollection<T>(typeof(T).Name)
.Aggregate()
.Match(predicate).ToListAsync();
return result;
}
public async Task<IList<T>> GetById(ObjectId id)
{
var result = await database.GetCollection<T>(typeof(T).Name)
.Aggregate()
.Match(x => x._id.Equals(id)).ToListAsync();
return result;
}
public async Task<UpdateResult> Update(Expression<Func<T, bool>> filter,T entity)
{
if (entity._id == null)
await Insert(entity);
var list = new List<string>();
list.Add("dealer_code");
var result = await collection.UpdateOneAsync(
Builders<T>.Filter.Where(filter),
Builders<T>.Update.Set(x=>x.dealer_code, entity.dealer_code));
if (result.IsAcknowledged)
{
Console.WriteLine("Success");
}
return result;
}
}
最后,当我更改Update.Set()而不是Update.AddToSet()
时,它开始工作答案 1 :(得分:0)
我的假设是您尝试拨打$addToSet
某些非集合的内容:
// ...
Builders<T>.Update.AddToSet("dealer_code", entity.dealer_code)
// ...
但正如您在评论中所解释的那样,dealer_code
的类型为string
。如果元素是集合,则只能向集合添加内容,例如string[]
或List<string>
。它并不十分清楚您想要实现的目标,但您可以尝试将string dealer_code
更改为List<string> dealer_codes
。