Heim  >  Artikel  >  Backend-Entwicklung  >  .Net Core führt eine Abfrage mit mehreren Bedingungen für MongoDB durch

.Net Core führt eine Abfrage mit mehreren Bedingungen für MongoDB durch

coldplay.xixi
coldplay.xixinach vorne
2020-07-18 16:39:564629Durchsuche

.Net Core führt eine Abfrage mit mehreren Bedingungen für MongoDB durch

In der Vergangenheit nutzten alle Projekte grundsätzlich die MySQL-Datenbank. Kürzlich gab es im Projektplan etwas freie Zeit, um das Protokollmodul auf MongoDB zu migrieren, das eine bessere Einfügung/Funktion bietet. Abfrageleistung. Das Schreiben mit mehreren Bedingungen hat wirklich einige Mühe gekostet, deshalb habe ich einen Artikel geschrieben, um es aufzuzeichnen.

Verwandte Lernempfehlungen: C#.Net-Entwicklungsgrafik-Tutorial

1. Vorbereitung

1. Der Installationsprozess wird nicht im Detail beschrieben

2. Referenzpaket hinzufügen

dotnet add package mongodb.bson
dotnet add package mongodb.driver

3. Verbindungskonfiguration zu appsetting.json hinzufügen

"MongodbHost": {
  "Connection": "mongodb://[username]:[password]@[ip]:[port]",
  "DataBase": "[database]",
  "Table": ""
 },

4. Methode zum Abrufen von MongoDBConfig

2. Abfragemethode

Die Abfragemethode hier Wenn es sich um eine einzelne Datenquelle handelt, kann der Host hier extrahiert und zu einem Attribut der Hilfsklasse werden.

public static MongodbHostOptions MongodbConfig()
{
  var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json");

  IConfiguration Configuration = builder.Build();
  var option = Configuration.GetSection("MongodbHost");
  return new MongodbHostOptions { Connection = option["Connection"], DataBase = option["DataBase"], Table = option["Table"] };
}

3. Rufen Sie die Abfragemethode auf 🎜>Hier gibt es auch eine Falle. Die Zeit ist Greenwich-Zeit. Wenn Sie das Zeitattribut definieren, werden Sie feststellen, dass es 0:00 ist , Sie müssen ein Tag hinzufügen

#region FindListByPage 分页查询集合
  /// <summary>
  /// 分页查询集合
  /// </summary>
  /// <param name="filter">查询条件</param>
  /// <param name="pageIndex">当前页</param>
  /// <param name="pageSize">页容量</param>
  /// <param name="count">总条数</param>
  /// <param name="field">要查询的字段,不写时查询全部</param>
  /// <param name="sort">要排序的字段</param>
  /// <returns></returns>
  public static List<T> FindListByPage(FilterDefinition<T> filter, int pageIndex, int pageSize, out int count, string[] field = null, SortDefinition<T> sort = null)
  {
    try
    {
      MongodbHostOptions host = Tools.AppSettingsTools.MongodbConfig();
      host.Table = "WSMessageLog";
      var client = MongodbClient<T>.MongodbInfoClient(host);
      count = Convert.ToInt32(client.CountDocuments(filter));
      //不指定查询字段
      if (field == null || field.Length == 0)
      {
        if (sort == null) return client.Find(filter).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList();
        //进行排序
        return client.Find(filter).Sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList();
      }

      //指定查询字段
      var fieldList = new List<ProjectionDefinition<T>>();
      for (int i = 0; i < field.Length; i++)
      {
        fieldList.Add(Builders<T>.Projection.Include(field[i].ToString()));
      }
      var projection = Builders<T>.Projection.Combine(fieldList);
      fieldList?.Clear();

      //不排序
      if (sort == null) return client.Find(filter).Project<T>(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList();

      //排序查询
      return client.Find(filter).Sort(sort).Project<T>(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList();

    }
    catch (Exception ex)
  {
    throw ex;
  }
}
#endregion

Das OprLogModel ist hier die Klasse, die die Abfragebedingungen definiert

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime logtime { get; set; }

Sie können auch zuerst eine leere Filterdefinition definieren und diese dann mit jeder Abfrage aggregieren Zustand durch Und:

public static LogPager<log_operate> Get_operate_log_mongo(OprLogModel qModel)
{
  LogPager<log_operate> pager = new LogPager<log_operate>();
  FilterDefinition<log_operate> filters;

   var sortbuilder = Builders<log_operate>.Sort;
  var sort = sortbuilder.Descending("operate_time");

  #region 用户权限过滤
  IEnumerable<string> IdList = dev_deviceRepository.GetBinding(qModel.user_id);
   filters = Builders<log_operate>.Filter.In("device_id", IdList);
  #endregion

  if (!string.IsNullOrEmpty(qModel.device_id))
  {
    var filters_did = Builders<log_operate>.Filter.Eq("device_id", qModel.device_id);
    filters = Builders<log_operate>.Filter.And(filters, filters_did);
  }
  if (qModel.sDate != null)
  {
    var filters_sdate = Builders<log_operate>.Filter.Gte<DateTime>("operate_time", Convert.ToDateTime(qModel.sDate));
    filters = Builders<log_operate>.Filter.And(filters, filters_sdate);
  }
  if (qModel.eDate != null)
  {
    var filters_edate = Builders<log_operate>.Filter.Lte<DateTime>("operate_time", Convert.ToDateTime(qModel.eDate));
    filters = Builders<log_operate>.Filter.And(filters, filters_edate);
  }
  int total;
  pager.data = MongoTools<log_operate>.FindListByPage(filters, qModel.pageindex, (qModel.pageindex - 1) * qModel.pagesize, out total, null, sort);
  pager.total = total;
  return pager;
}
#endregion

Das obige ist der detaillierte Inhalt von.Net Core führt eine Abfrage mit mehreren Bedingungen für MongoDB durch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen