我在mongodb中有json文档
样品

{
 "SchemaName": "Intelligence",
 "SchemaDescription": "WindPower",
 "SchemaType": "WindPower",
 "SchemaTypeId": 1,
 "SchemaData": {
  "ProjectId": 1,
  "LastUpdated": "2016-07-02T19:27:28.000+0000",
  "ProjectName": "Zhonghuashan II",
  "Capacity": 49.0,
  "Technology": "Onshore",
   "Country":{
          "CountryId":1,
          "CountryName":"UnitedKingdom",
          "CountryCode":"UK"
    }
 }
}

现在我正在根据搜索条件筛选数据
var filter = Builders<Schema>.Filter.Or(
                Builders<Schema>.Filter.Where(p => p.SchemaData.ProjectName.ToLower().Contains(searchCriteria.ProjectName.ToLower())),
                Builders<Schema>.Filter.Where(p => p.SchemaData.Technology.ToLower().Contains(searchCriteria.Technology.ToLower())),
                Builders<Schema>.Filter.Where(p => p.SchemaData.Country.CountryName.ToLower().Contains(searchCriteria.Country.ToLower()))
            );
            var list = await collectionHandler.ReadOnly<Schema>().FindSync(filter).ToListAsync();
            return list;

我需要添加条件
searchCriteria.ProjectName ="" || searchCriteria.Technology="" || searchCriteria.Country = "" = return all records
searchCriteria.ProjectName ="abc" and searchCriteria.Technology="xyz" || searchCriteria.Country = "" = return matched records
searchCriteria.ProjectName ="abc" and searchCriteria.Technology="xyz" and searchCriteria.Country = "pqr" = return matched records
searchCriteria.ProjectName ="" || searchCriteria.Technology="xyz" and searchCriteria.Country = "pqr" = return matched records
searchCriteria.Technology="" ="abc" || searchCriteria.Technology="xyz" and searchCriteria.Country = "pqr" = return matched records
假设搜索条件的任何属性可以具有和和或与搜索条件的其他属性的组合

最佳答案

对我来说,我可以直接将过滤器作为字符串传递:

    FilterDefinition<BsonDocument> filter = @"{ ""Prop"": { $Or: [{ $and: [...] },{ $and: [...] }] } }";
    var lst = collection.Find(filter);

您可以查看文档:
https://docs.mongodb.com/v3.2/reference/operator/query/or/

关于c# - Mongodb C#filter使用和或运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47036451/

10-10 18:28