Maison > développement back-end > Tutoriel C#.Net > .Net Core effectue une requête multi-conditions sur MongoDB

.Net Core effectue une requête multi-conditions sur MongoDB

coldplay.xixi
Libérer: 2020-07-18 16:40:26
avant
4643 Les gens l'ont consulté

.Net Core effectue une requête multi-conditions sur MongoDB

Dans le passé, tous les projets utilisaient essentiellement la base de données MySQL. Récemment, il y avait du temps libre dans le calendrier du projet. Le leader a décidé de migrer le module de journalisation vers MongoDB, qui a une meilleure insertion/. performances des requêtes. Requête multi-conditions L'écriture a vraiment demandé un certain effort, j'ai donc écrit un article pour l'enregistrer

Recommandations d'apprentissage associées : Tutoriel graphique de développement C#.Net<.>

1. Préparation

1. Le processus d'installation ne sera pas décrit en détail

2 Ajouter un paquet de référence

dotnet add package mongodb.bson
dotnet add package mongodb.driver
Copier après la connexion
<🎜. >3. Ajoutez la configuration de connexion à appsetting.json

"MongodbHost": {
  "Connection": "mongodb://[username]:[password]@[ip]:[port]",
  "DataBase": "[database]",
  "Table": ""
 },
Copier après la connexion

4. Méthode d'obtention de MongoDBConfig

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"] };
}
Copier après la connexion

2 Méthode de requête

La méthode de requête ici. est trouvé en ligne et utilisé directement. S'il s'agit d'une seule source de données, l'hôte ici peut être extrait et devenir un attribut de la classe d'assistance.

#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
Copier après la connexion

3 Appelez la méthode de requête<. 🎜>

Il y a aussi un piège ici. Stockage dans MongoDB L'heure est l'heure de Greenwich Si vous insérez 8h00, vous constaterez qu'elle devient 0h00 lors de l'interrogation. , vous devez ajouter une balise

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime logtime { get; set; }
Copier après la connexion

. L'OprLogModel est ici la classe qui définit les conditions de requête

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
Copier après la connexion

Vous pouvez également définir d'abord une définition de filtre vide, puis l'agréger avec chaque requête. condition à travers Et :

FilterDefinition<log_operate> filters = FilterDefinition<log_operate>.Empty;
var filters_idlist = Builders<log_operate>.Filter.In("device_id", IdList);
filters = Builders<log_operate>.Filter.And(filters, filters_idlist);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:jb51.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal