Rumah pembangunan bahagian belakang Tutorial C#.Net .Net Core对MongoDB执行多条件查询

.Net Core对MongoDB执行多条件查询

Jul 18, 2020 pm 04:39 PM
.net core mongodb Pertanyaan berbilang syarat

.Net Core对MongoDB执行多条件查询

以前项目基本上全部使用MySQL数据库, 最近项目排期空出了一点时间leader决定把日志模块迁移到插入/查询性能更好的MongoDB上. 多条件查询的写法着实费了些功夫, 撰文记录一下.

相关学习推荐:C#.Net开发图文教程

一、准备工作

1. 安装过程, 不赘述了

2. 添加ReferencePackage

dotnet add package mongodb.bson
dotnet add package mongodb.driver
Salin selepas log masuk

3. appsetting.json添加连接配置

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

4. 获取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"] };
}
Salin selepas log masuk

二、查询方法

这里的查询方法是网上找的, 直接拿来用了. 如果是单一数据源的话, 这里的host可以提取出来成为helper类的属性.

#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
Salin selepas log masuk

三、调用查询方法

这里还踩了一个坑. MongoDB里存储的时间是格林尼治时间, 插入8:00, 查询时会发现变成了0:00,所以定义时间属性的时候需要加个标签

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

这里的OprLogModel是定义了查询条件的类.

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
Salin selepas log masuk

也可以先定义一个空的filterdefinition, 然后与各查询条件通过And聚合:

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);
Salin selepas log masuk

Atas ialah kandungan terperinci .Net Core对MongoDB执行多条件查询. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara mengkonfigurasi pengembangan automatik MongoDB pada Debian Cara mengkonfigurasi pengembangan automatik MongoDB pada Debian Apr 02, 2025 am 07:36 AM

Artikel ini memperkenalkan cara mengkonfigurasi MongoDB pada sistem Debian untuk mencapai pengembangan automatik. Langkah -langkah utama termasuk menubuhkan set replika MongoDB dan pemantauan ruang cakera. 1. Pemasangan MongoDB Pertama, pastikan MongoDB dipasang pada sistem Debian. Pasang menggunakan arahan berikut: SudoaptDateSudoaptInstall-ImongoDB-Org 2. Mengkonfigurasi set replika replika MongoDB MongoDB Set memastikan ketersediaan dan kelebihan data yang tinggi, yang merupakan asas untuk mencapai pengembangan kapasiti automatik. Mula MongoDB Service: sudosystemctlstartmongodsudosys

Cara Memastikan Ketersediaan MongoDB Tinggi di Debian Cara Memastikan Ketersediaan MongoDB Tinggi di Debian Apr 02, 2025 am 07:21 AM

Artikel ini menerangkan cara membina pangkalan data MongoDB yang sangat tersedia pada sistem Debian. Kami akan meneroka pelbagai cara untuk memastikan keselamatan data dan perkhidmatan terus beroperasi. Strategi Utama: Replicaset: Replicaset: Gunakan replika untuk mencapai redundansi data dan failover automatik. Apabila nod induk gagal, set replika secara automatik akan memilih nod induk baru untuk memastikan ketersediaan perkhidmatan yang berterusan. Sandaran dan Pemulihan Data: Secara kerap Gunakan perintah Mongodump untuk membuat sandaran pangkalan data dan merumuskan strategi pemulihan yang berkesan untuk menangani risiko kehilangan data. Pemantauan dan penggera: Menyebarkan alat pemantauan (seperti Prometheus, Grafana) untuk memantau status MongoDB dalam masa nyata, dan

Kaedah Navicat untuk melihat kata laluan pangkalan data MongoDB Kaedah Navicat untuk melihat kata laluan pangkalan data MongoDB Apr 08, 2025 pm 09:39 PM

Tidak mustahil untuk melihat kata laluan MongoDB secara langsung melalui Navicat kerana ia disimpan sebagai nilai hash. Cara mendapatkan kata laluan yang hilang: 1. Tetapkan semula kata laluan; 2. Periksa fail konfigurasi (mungkin mengandungi nilai hash); 3. Semak Kod (boleh kata laluan Hardcode).

C# .NET Soalan & Jawapan Wawancara: Tahap kepakaran anda C# .NET Soalan & Jawapan Wawancara: Tahap kepakaran anda Apr 07, 2025 am 12:01 AM

C#.NET Soalan dan jawapan wawancara termasuk pengetahuan asas, konsep teras, dan penggunaan lanjutan. 1) Pengetahuan asas: C# adalah bahasa berorientasikan objek yang dibangunkan oleh Microsoft dan digunakan terutamanya dalam rangka .NET. 2) Konsep teras: Delegasi dan peristiwa membolehkan kaedah mengikat dinamik, dan LINQ menyediakan fungsi pertanyaan yang kuat. 3) Penggunaan Lanjutan: Pengaturcaraan Asynchronous meningkatkan respons, dan pokok ekspresi digunakan untuk pembinaan kod dinamik.

Advanced C# .NET Tutorial: Ace Wawancara Pemaju Kanan Anda Seterusnya Advanced C# .NET Tutorial: Ace Wawancara Pemaju Kanan Anda Seterusnya Apr 08, 2025 am 12:06 AM

Temu bual dengan pemaju kanan C# memerlukan menguasai pengetahuan teras seperti pengaturcaraan asynchronous, LINQ, dan prinsip kerja dalaman Rangka .NET. 1. Pengaturcaraan Asynchronous memudahkan operasi melalui async dan menunggu untuk meningkatkan respons aplikasi. 2.Linq mengendalikan data dalam gaya SQL dan perhatikan prestasi. 3. CLR kerangka bersih menguruskan ingatan, dan pengumpulan sampah perlu digunakan dengan berhati -hati.

C# .NET: Meneroka Konsep Teras dan Asas Pengaturcaraan C# .NET: Meneroka Konsep Teras dan Asas Pengaturcaraan Apr 10, 2025 am 09:32 AM

C# adalah bahasa pengaturcaraan yang berorientasikan objek moden yang dibangunkan oleh Microsoft dan sebagai sebahagian daripada Rangka Kerja .NET. 1.C# menyokong pengaturcaraan berorientasikan objek (OOP), termasuk enkapsulasi, warisan dan polimorfisme. 2. Pengaturcaraan Asynchronous dalam C# dilaksanakan melalui Async dan menunggu kata kunci untuk meningkatkan respons aplikasi. 3. Gunakan LINQ untuk memproses koleksi data dengan ringkas. 4. Kesilapan umum termasuk pengecualian rujukan null dan pengecualian indeks luar. Kemahiran penyahpepijatan termasuk menggunakan debugger dan pengendalian pengecualian. 5. Pengoptimuman Prestasi termasuk menggunakan StringBuilder dan mengelakkan pembungkusan yang tidak perlu dan unboxing.

Apakah strategi sandaran CentOS MongoDB? Apakah strategi sandaran CentOS MongoDB? Apr 14, 2025 pm 04:51 PM

Penjelasan terperinci mengenai strategi sandaran yang cekap MongoDB di bawah sistem CentOS Artikel ini akan memperkenalkan secara terperinci pelbagai strategi untuk melaksanakan sandaran MongoDB pada sistem CentOS untuk memastikan kesinambungan data dan kesinambungan perniagaan. Kami akan merangkumi sandaran manual, sandaran masa, sandaran skrip automatik, dan kaedah sandaran dalam persekitaran kontena Docker, dan menyediakan amalan terbaik untuk pengurusan fail sandaran. Sandaran Manual: Gunakan perintah Mongodump untuk melakukan sandaran penuh manual, contohnya: Mongodump-Hlocalhost: 27017-U Pengguna-P Password-D Database Data-O/Backup Direktori Perintah ini akan mengeksport data dan metadata pangkalan data yang ditentukan ke direktori sandaran yang ditentukan.

Cara Menyulitkan Data dalam Debian Mongodb Cara Menyulitkan Data dalam Debian Mongodb Apr 12, 2025 pm 08:03 PM

Menyulitkan pangkalan data MongoDB pada sistem Debian memerlukan langkah berikut: Langkah 1: Pasang MongoDB terlebih dahulu, pastikan sistem Debian anda dipasang MongoDB. Jika tidak, sila rujuk kepada dokumen MongoDB rasmi untuk pemasangan: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/step 2: menghasilkan fail kunci penyulitan Buat fail yang mengandungi kunci penyulitan dan tetapkan kebenaran yang betul:

See all articles