C#条件$match
我在C#中有以下代码以匹配字段:C#条件$match,c#,mongodb,C#,Mongodb,我在C#中有以下代码以匹配字段: var match = new BsonDocument { { "$match", new BsonDocument { { "Country", paramsEntity.Country }, { "Company_ID", String.IsNullOrEmpty(paramsEntity.CompanyID) ? "$Co
var match = new BsonDocument
{
{
"$match",
new BsonDocument
{
{ "Country", paramsEntity.Country },
{ "Company_ID", String.IsNullOrEmpty(paramsEntity.CompanyID) ? "$Company_ID" : paramsEntity.CompanyID },
{ "Staff_ID", String.IsNullOrEmpty(paramsEntity.StaffID) ? "$Staff_ID" : paramsEntity.StaffID }
}
}
};
它什么也没给我。但当我从$match中取出Company_ID时,它会给出结果。我的公司ID筛选有问题吗?可能有更好的方法,但您可以:
var query = collection.AsQueryable().Where(e => e.Country == paramsEntity.Country);
if (!string.IsNullOrEmpty(paramsEntity.CompanyId))
{
query = query.Where(e => e.CompanyId == paramsEntity.CompanyId);
}
if (!string.IsNullOrEmpty(paramsEntity.StaffId))
{
query = query.Where(e => e.StaffId == paramsEntity.StaffId);
}
它使用IQueryable接口,并在查询中附加过滤器(如果已指定)
或者,您可以这样做:
var filterBuilder = Builders<yourObjectType>.Filter;
var filters = new List<FilterDefinition<yourObjectType>>();
filters.Add(filterBuilder.Eq(o => o.Country, paramsEntity.Country));
if (!string.IsNullOrEmpty(paramsEntity.CompanyId))
{
filters.Add(filterBuilder.Eq(o => o.CompanyId, paramsEntity.CompanyId));
}
if (!string.IsNullOrEmpty(paramsEntity.StaffId))
{
filters.Add(filterBuilder.Eq(o => o.StaffId, paramsEntity.StaffId));
}
var dataCursor = collection.Find(filterBuilder.And(filters));
var filterBuilder=Builders.Filter;
var filters=新列表();
添加(filterBuilder.Eq(o=>o.Country,paramentity.Country));
如果(!string.IsNullOrEmpty(paramentity.CompanyId))
{
Add(filterBuilder.Eq(o=>o.CompanyId,paramentity.CompanyId));
}
如果(!string.IsNullOrEmpty(paramentity.StaffId))
{
Add(filterBuilder.Eq(o=>o.StaffId,paramentity.StaffId));
}
var dataCursor=collection.Find(filterBuilder.And(filters));
它编译一个条件列表,然后将它们相加以产生结果。这是我的另一种方法。希望与大家分享:
dynamic param = new JObject();
if (!String.IsNullOrEmpty(paramsEntity.Country))
{
param.Country = paramsEntity.Country;
}
if (!String.IsNullOrEmpty(paramsEntity.CompanyID))
{
param.Company_ID = paramsEntity.CompanyID;
}
if (!String.IsNullOrEmpty(paramsEntity.StaffID))
{
param.Staff_ID = paramsEntity.StaffID;
}
if (!String.IsNullOrEmpty(paramsEntity.BranchID))
{
param.Branch_ID = paramsEntity.BranchID;
}
var match = new BsonDocument
{
{ "$match",
new BsonDocument { BsonSerializer.Deserialize<BsonDocument>(JsonConvert.SerializeObject(param))
}
};
dynamic param=new JObject();
如果(!String.IsNullOrEmpty(paramentity.Country))
{
参数国家=参数国家;
}
如果(!String.IsNullOrEmpty(paramentity.CompanyID))
{
param.Company_ID=paramentity.CompanyID;
}
如果(!String.IsNullOrEmpty(paramentity.StaffID))
{
param.Staff_ID=paramsEntity.StaffID;
}
如果(!String.IsNullOrEmpty(paramentity.BranchID))
{
param.Branch_ID=paramsEntity.BranchID;
}
var匹配=新的BsonDocument
{
{“$match”,
新BsonDocument{BsonSerializer.Deserialize(JsonConvert.SerializeObject(param))
}
};
这是一个更大的查询的一部分,还是您将其用作带有可选部分的筛选器?是的,有问题。您实际上想在这里做什么?您基本上是想确定您是否定义了输入参数,然后将其作为条件传递给字段,还是根本没有条件传递给字段?是..我正在尝试确定是否存在输入参数。您的基本误解是,您试图在筛选条件的“右侧”部分访问文档的现有字段(如“字段”:“existingfield”
)MongoDB根本不支持它。@dnickless Mongo实际上使用$where操作符支持它。虽然效率低下,但它是受支持的。例如:{$where:“this.a
。