C# 使用C查询MongoDB集合中嵌入文档的Where子句中的投影#
在数据库中而不是内存中筛选集合 我有一个模型类,将其保存在MongoDB集合中,然后根据我下面提到的期望查询相同的类 我的模型课:C# 使用C查询MongoDB集合中嵌入文档的Where子句中的投影#,c#,mongodb,mongodb-query,mongodb-.net-driver,C#,Mongodb,Mongodb Query,Mongodb .net Driver,在数据库中而不是内存中筛选集合 我有一个模型类,将其保存在MongoDB集合中,然后根据我下面提到的期望查询相同的类 我的模型课: public Class Employee { public ObjectId Id { get; set; } public string EmpID { get; set; } public string EmpName { get; set; } public List<Mobile> EmpMobile { get
public Class Employee
{
public ObjectId Id { get; set; }
public string EmpID { get; set; }
public string EmpName { get; set; }
public List<Mobile> EmpMobile { get; set; }
public bool IsLive { get; set; }
}
public Class Mobile
{
public string MobID { get; set; }
public string MobNumber { get; set; }
public bool IsPreferred { get; set; }
public bool IsLive { get; set; }
}
请帮助我如何使用c#MongoDB为我的预期输出编写Where子句查询
注意:在数据库中而不是内存中筛选集合
我的MongoDB库和连接是
IMongoClient _client = new MongoClient();
IMongoDatabase _database = _client.GetDatabase("Test");
我认为这将解决您的问题:
var collection = _database.GetCollection<Employee>("employee"); // (1)
var filterBuilder = Builders<BsonDocument>.Filter;
var filter = filterBuilder.Eq("IsLive", true) & filterBuilder.Eq("EmpMobile.IsLive", true); // (2)
var results = await collection.FindAsync(filter).ToListAsync(); // (3)
var collection=_database.GetCollection(“employee”);//(1)
var filterBuilder=Builders.Filter;
var filter=filterBuilder.Eq(“IsLive”,true)和filterBuilder.Eq(“EmpMobile.IsLive”,true);//(2)
var results=await collection.FindAsync(filter.ToListAsync();//(3)
(1) :您需要使用包含要查询的数据的集合名称更改集合名称。另外,请注意,它请求一个t文档
作为通用参数。似乎Employee并没有从t文档继承,但您可以这样做,也可以为此创建另一个DTO类
(2) :您可以使用位和运算符(&
)组合条件
此外,还可以直接查询数组的内部值(在类中作为列表)。事实证明,如果任何数组值满足条件,它将返回文档。在您的示例中,这将返回EmpID
s100的文档,但其中将同时包含MobileNumber
s。您检索到了满足条件的文档,但检索到了整个文档
(3) 最后,将结果呈现到列表中,以便将其保存在内存中。或者,您可以使用cursor.MoveNextAsync()
浏览结果,但这将使您与MongoDB的连接保持更长的打开时间
您可以在MongoDB文档的示例中找到大多数信息。我认为这将解决您的问题:
var collection = _database.GetCollection<Employee>("employee"); // (1)
var filterBuilder = Builders<BsonDocument>.Filter;
var filter = filterBuilder.Eq("IsLive", true) & filterBuilder.Eq("EmpMobile.IsLive", true); // (2)
var results = await collection.FindAsync(filter).ToListAsync(); // (3)
var collection=_database.GetCollection(“employee”);//(1)
var filterBuilder=Builders.Filter;
var filter=filterBuilder.Eq(“IsLive”,true)和filterBuilder.Eq(“EmpMobile.IsLive”,true);//(2)
var results=await collection.FindAsync(filter.ToListAsync();//(3)
(1) :您需要使用包含要查询的数据的集合名称更改集合名称。另外,请注意,它请求一个t文档
作为通用参数。似乎Employee并没有从t文档继承,但您可以这样做,也可以为此创建另一个DTO类
(2) :您可以使用位和运算符(&
)组合条件
此外,还可以直接查询数组的内部值(在类中作为列表)。事实证明,如果任何数组值满足条件,它将返回文档。在您的示例中,这将返回EmpID
s100的文档,但其中将同时包含MobileNumber
s。您检索到了满足条件的文档,但检索到了整个文档
(3) 最后,将结果呈现到列表中,以便将其保存在内存中。或者,您可以使用cursor.MoveNextAsync()
浏览结果,但这将使您与MongoDB的连接保持更长的打开时间
您可以在MongoDB文档的中找到大多数带有示例的信息。您的方法有几个int
首先,您使用的是collectionEmpInfo.InsertOne(EmpInfo)
我假设您想使用InsertMany
至于对集合进行过滤,您必须知道,如果检索到整个对象,您的过滤器将产生影响,因此在实体中的嵌入数组上添加过滤器不会过滤数组,而是根据是否匹配嵌入数组上的查询条件来确定是否检索到整个对象。我的建议是只对查询中的员工应用过滤器,并在内存中过滤结果集
var filter = filterBuilder.Eq("IsLive", true);
var results = await collection.FindAsync(filter).ToListAsync();
现在在内存中筛选结果集合,如中所示
var filteredResults = results.ForEach(employee => employee.EmpMobile = employee.EmpMobile.Where(mob => mob.isLive).ToList());
您的方法有几个int
首先,您使用的是collectionEmpInfo.InsertOne(EmpInfo)
我假设您想使用InsertMany
至于对集合进行过滤,您必须知道,如果检索到整个对象,您的过滤器将产生影响,因此在实体中的嵌入数组上添加过滤器不会过滤数组,而是根据是否匹配嵌入数组上的查询条件来确定是否检索到整个对象。我的建议是只对查询中的员工应用过滤器,并在内存中过滤结果集
var filter = filterBuilder.Eq("IsLive", true);
var results = await collection.FindAsync(filter).ToListAsync();
现在在内存中筛选结果集合,如中所示
var filteredResults = results.ForEach(employee => employee.EmpMobile = employee.EmpMobile.Where(mob => mob.isLive).ToList());
编辑
添加了投影
-因此所选数组仅包含IsLive==true的文档
我认为使用类型化查询更容易,因为c
是强类型语言。
我使用了ElemMatch
,因为这是用来扫描数组并查找匹配元素的
var filterDef = new FilterDefinitionBuilder<Employee>();
var filter = filterDef.Eq(x => x.IsLive, true);
var projectDef = new ProjectionDefinitionBuilder<Employee>();
var projection = projectDef.ElemMatch<Mobile>("EmpMobile", "{IsLive:true}");
var empList = collectionEmpInfo.Find(filter).Project<Employee>(projection).ToList();
var filterDef=new FilterDefinitionBuilder();
var filter=filterDef.Eq(x=>x.IsLive,true);
var projectDef=新的ProjectOnDefinitionBuilder();
var projection=projectDef.ElemMatch(“EmpMobile”,即“{IsLive:true}”);
var empList=collectionEmpInfo.Find(filter.Project(projection.ToList();
编辑
添加了投影
-因此所选数组仅包含IsLive==true的文档
我认为使用类型化查询更容易,因为c
是强类型语言。
我使用了ElemMatch
,因为这是为了扫描阵列并查找匹配项而设计的