MongoDB与.Net6

它没有表但有Collection,没有行但有document

win=>Select模型 1024

linux=>epoll 65535 可能

暴露腾讯云端口

27017

docker下载镜像

启动容器

复制代码
docker run -d --name mongo1 -p 27017:27017 mongo
javascript 复制代码
[root@VM-4-7-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                           NAMES
71a59e454c0a   mongo     "docker-entrypoint.s..."   10 minutes ago   Up 10 minutes   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   mongo1
[root@VM-4-7-centos ~]# docker exec -it 71 bash


71 表示容器id 71a59e454c0a 
javascript 复制代码
root@71a59e454c0a:/# mongosh
Current Mongosh Log ID: 69626a66daa6bcc0ce8de665
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.10
Using MongoDB:          8.2.3
Using Mongosh:          2.5.10

For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

------
   The server generated these startup warnings when booting
   2026-01-10T14:49:54.088+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
   2026-01-10T14:49:54.196+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2026-01-10T14:49:54.196+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2026-01-10T14:49:54.196+00:00: We suggest setting the contents of sysfsFile to 0.
   2026-01-10T14:49:54.196+00:00: vm.max_map_count is too low
------

test>
javascript 复制代码
test> show databases
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
test>
javascript 复制代码
test> use test
already on db test
test> show databases
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB -----没显示test


test> use test
already on db test
test>  db.createCollection("userinfo") --- 创建
{ ok: 1 }
test> show databases
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
test     8.00 KiB -----显示了
test>

数据库crud

插入

db.userinfo.insert({name:"贾宝玉",age:25,gender:"男",address:"贾府"}); // 插入文档(指定_id)

db.userinfo.insert({id:1,name:"贾宝玉",age:25,gender:"男",address:"贾府",description:"大贾"});

db.userinfo.insert({id:1,name:"贾宝玉",description:"大贾"}); // 查询集合中所有文档

显示数据库

db.userinfo.find({});

javascript 复制代码
// 修正语法错误,循环插入10条数据
for (var i = 1; i <= 10; i++) {
  db.userinfo.insert({ name: "clar" + i, age: 31 });
}

// 批量生成10条数据并插入
var dataList = [];
for (var i = 1; i <= 10; i++) {
  dataList.push({ name: "clar" + i, age: 31 });
}
db.userinfo.insertMany(dataList);

查询前 N 条数据

javascript

运行

db.集合名称.find({}).limit(条数)

作用:只查询结果中的前 N 条数据(用于分页或限制返回数量)。

示例:db.userinfo.find({}).limit(5) → 查询userinfo集合的前 5 条数据。

条件查询(指定字段匹配 + 字段过滤)

db.userinfo.find({name:"clay1",age:1},{name:1,_id:0})

语法结构:find(查询条件, 字段投影)

查询条件(第一个参数):{name:"clay1",age:1} → 只查询name为clay1且age为 1 的文档。

字段投影(第二个参数):{name:1,_id:0} → 控制返回的字段:

字段名:1 → 显示该字段;

字段名:0 → 隐藏该字段(_id默认显示,需显式设为0才会隐藏)。

该示例的实际效果:查询name=clay1且age=1的文档,只返回name字段,不返回_id。

javascript 复制代码
db.cl.find({}).sort({age:1})  --升序

db.cl.find({}).sort({age:-1}) -- 降序

db.cl.find({}).sort({age:1}).skip(2).limit(2) --跳过排序后前两条取两条
javascript 复制代码
db.cl.find({}).sort({age:-1})
javascript 复制代码
db.cl.insert({name: "8888", age: 1, addr: "address", flag: true})

db.cl.update({name: "8888"}, {name: "99"})----------------旧版本可能会去掉其他字段,不建议
MongoDB 4.2+ 版本强制要求:更新内容必须使用$操作符(如$set)|
                                                         |
db.userinfo.update(
  {name: "clar1"},  // 查询条件:匹配name为clar1的文档
  {$set: {name: "99"}}  // 更新内容:仅修改name字段为99,保留其他字段
)


db.cl.update(
  {name: "8888"},  // 查询条件:匹配name为"8888"的文档
  {
    $set: {name: "zs44"},   // 修改name字段值为"zs44"
    $inc: {age: 10},        // 将age字段的值递增10(原age=1 → 变为11)
    $rename: {addr: "address"},  // 将字段名"addr"重命名为"address"
    $unset: {flag: ""}      // 删除flag字段
  }
)
查询结果:
{ "_id": ObjectId("..."), "name": "zs44", "age": 11, "address": "address" }
javascript 复制代码
统计男生、女生的总年龄
db.cl.aggregate([
  {
    $group: {
      _id: "$sex",  // 按sex字段分组(男生/女生)
      rs: { $sum: "$age" }  // 计算每组的age字段总和
    }
  }
])

[{ "_id": "男", "rs": 250 }, { "_id": "女", "rs": 220 }]

-------------
统计男生、女生的总人数
db.cl.aggregate([
  {
    $group: {
      _id: "$sex",  // 按sex分组
      rs: { $sum: 1 }  // 每组计数(每匹配一条数据,累加1)
    }
  }
])

[{ "_id": "男", "rs": 10 }, { "_id": "女", "rs": 8 }]

-----------
求学生总数和平均年龄
db.cl.aggregate([
  {
    $group: {
      _id: null,  // _id为null表示不分组,统计整个集合
      total_num: { $sum: 1 },  // 总人数
      total_avg: { $avg: "$age" }  // 年龄的平均值
    }
  }
])

[{ "_id": null, "total_num": 18, "total_avg": 26.11 }]

----------
db.cl.aggregate([
  { $group: { _id: "$sex", rs: { $sum: 1 } } },  // 按sex分组计数
  { $sort: { rs: 1 } }  // 按人数(rs字段)升序排列
])

[{ "_id": "女", "rs": 8 }, { "_id": "男", "rs": 10 }]

MongoDB.Driver对接Net6

javascript 复制代码
using MongoDB.Driver;
using MongoDB.Bson;
using System;

namespace MongoDBDemo
{
    public class JsonOperation
    {
        --order  表名/集合
        --document --row
        public void Show()
        {
            // 1. 创建MongoDB客户端,指定连接地址
            var client = new MongoClient("mongodb://192.168.1.12:27017");

            // 2. 获取指定数据库(不存在自动创建)
            var database = client.GetDatabase("mongodbDemo");

            // 3. 构建要插入的文档对象 - 解析JSON字符串为BsonDocument
            var document = BsonDocument.Parse("{a:1, b:[{c:1}], c:'ff'}");

            // 4. 获取集合,插入单条文档(集合不存在自动创建)
            database.GetCollection<BsonDocument>("order").InsertOne(document);

            // 5. 查询集合中 a=1 的所有文档,返回List集合
            var info = database.GetCollection<BsonDocument>("order").Find("{a:1}").ToList();

            // 6. 操作成功提示
            Console.WriteLine("ok");
        }
    }
}
javascript 复制代码
using MongoDB.Driver;
using System;

// 泛型数据库操作类,约束T为类且具有无参构造函数
public class DBbase<T> where T : class, new()
{
    // MongoDB客户端、数据库、集合对象
    MongoClient client;
    IMongoDatabase database;
    public IMongoCollection<T> collection;

    // 构造函数:初始化连接与集合
    public DBbase()
    {
        // 1. 初始化MongoDB客户端(连接地址可替换为实际地址)
        client = new MongoClient("mongodb://192.168.1.12:27017");
        // 2. 获取指定数据库(此处为"test"库)
        database = client.GetDatabase("test");
        // 3. 获取泛型对应的集合(集合名自动取T的类名小写)
        Type type = typeof(T);
        collection = database.GetCollection<T>(type.Name.ToLower());
    }

    // 删除数据库
    public void DropDatabase()
    {
        client.DropDatabase("test");
    }

    // 插入单条数据
    public void InsertOne(T model)
    {
        collection.InsertOne(model);
    }

    // 批量插入数据
    public void InsertMany(params T[] modes)
    {
        collection.InsertMany(modes);
    }

    // 查询:返回可查询的泛型集合
    public IMongoQueryable<T> Select()
    {
        return collection.AsQueryable<T>();
    }

    // 分页查询(指定页码、页大小)
    public IMongoQueryable<T> Select(int pageIndex, int pageSize)
    {
        return collection.AsQueryable<T>()
                         .Skip(pageSize * (pageIndex - 1))
                         .Take(pageSize);
    }

    // 条件+排序+分页查询
    public IMongoQueryable<T> Select(Expression<Func<T, bool>> predicate, 
                                     Expression<Func<T, object>> keySelector, 
                                     int pageIndex, int pageSize)
    {
        return collection.AsQueryable<T>()
                         .Where(predicate)
                         .OrderBy(keySelector)
                         .Skip(pageSize * (pageIndex - 1))
                         .Take(pageSize);
    }

    // 批量更新
    public void UpdateMany(Expression<Func<T, bool>> filter, UpdateDefinition<T> update)
    {
        collection.UpdateMany(filter, update);
    }

    // 单条替换更新(覆盖文档)
    public void UpdateOne(Expression<Func<T, bool>> filter, T update)
    {
        collection.ReplaceOne(filter, update);
    }

    // 批量删除
    public void DeleteMany(Expression<Func<T, bool>> filter)
    {
        collection.DeleteMany(filter);
    }
}
javascript 复制代码
using System;

// 部门信息实体类
public class DeptInfo
{
    public int DeptId { get; set; }
    public string DeptName { get; set; }
}

// 用户信息实体类
public class Userinfo
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public int Age { get; set; }
    public string Sex { get; set; }
    public string Admin { get; set; }
    public DeptInfo DeptInfo { get; set; }
}

// Linq操作类
public class LinqOperation
{
    // 初始化DBbase泛型实例(操作Userinfo集合)
    static DBbase<Userinfo> dBbase = new DBbase<Userinfo>();

    // 删除数据库
    public static void DropDatabase()
    {
        dBbase.DropDatabase();
    }

    // 插入单条用户数据
    public static void InsertOne()
    {
        dBbase.InsertOne(new Userinfo()
        {
            Id = Guid.NewGuid().ToString(),
            Name = "诸葛亮",
            Address = "蜀国",
            Age = 27,
            Sex = "男",
            Admin = "admin",
            DeptInfo = new DeptInfo()
            {
                DeptId = 1,
                DeptName = "蜀国集团"
            }
        });
        dBbase.InsertOne(new Userinfo()
        {
            Id = Guid.NewGuid().ToString(),
            Name = "荀彧",
            Address = "魏国",
            Age = 47,
            Sex = "男",
            DeptInfo = new DeptInfo()
            {
                DeptId = 2,
                DeptName = "魏国集团"
            }
        });
        Console.WriteLine("写入完成");
    }

    public static void InsertMany()
    {
        // 周瑜
        var zhouyu = new Userinfo()
        {
            Id = Guid.NewGuid().ToString(),
            Name = "周瑜",
            Address = "吴国",
            Age = 32,
            Sex = "男",
            DeptInfo = new DeptInfo() { DeptId = 3, DeptName = "吴国集团" }
        };

        // 大乔
        var daqiao = new Userinfo()
        {
            Id = Guid.NewGuid().ToString(),
            Name = "大乔",
            Address = "吴国",
            Age = 14,
            Sex = "女",
            DeptInfo = new DeptInfo() { DeptId = 3, DeptName = "吴国集团" }
        };

        // 执行批量插入
        dBbase.InsertMany(zhouyu, daqiao);
    }

    // 分页查询(条件+排序+分页)
    public static void GetPage()
    {
        // 1. 按条件(Sex="男")、排序(按Age)、分页(第2页,每页2条)查询
        var pageList = dBbase.Select(
            m => m.Sex == "男",  // 筛选条件:性别为男
            m => m.Age,          // 排序字段:按年龄
            2, 2                 // 页码、页大小
        );
        // 遍历输出结果
        foreach (var item in pageList)
        {
            Console.WriteLine(item.Name + ":" + item.Age);
        }

        // 2. Linq语法查询:性别为男 且 年龄>18的用户
        var query = from p in dBbase.collection.AsQueryable()
                    where (p.Sex == "男") && p.Age > 18
                    select p;
        // 遍历输出结果
        foreach (var item in query)
        {
            Console.WriteLine(item.Name + ":" + item.Age);
        }
    }

    // 更新单条数据
    public static void Update()
    {
        // 查询Name为"大乔"的用户
        var daqiaod = dBbase.Select().Where(m => m.Name == "大乔").FirstOrDefault();
        if (daqiaod != null)
        {
            // 修改年龄为18
            daqiaod.Age = 18;
            // 执行更新(按Id匹配)
            dBbase.UpdateOne(m => m.Id == daqiaod.Id, daqiaod);
            Console.WriteLine("修改完成");
        }
    }

    // 批量删除
    public static void DeleteMany()
    {
        // 删除Name为"大乔"的所有用户
        dBbase.DeleteMany(m => m.Name == "大乔");
        Console.WriteLine("删除完成");

        // 全部删除(条件恒成立)
        dBbase.DeleteMany(m => 1 == 1);
        Console.WriteLine("全部删除完成");
    }

}
相关推荐
BryceBorder2 小时前
SCAU--数据库
数据库·oracle·dba
有味道的男人2 小时前
京东关键词API接口获取
数据库
罗光记2 小时前
《人工智能安全治理研究报告(2025年)发布
数据库·其他·百度·新浪微博
202321336054 刘3 小时前
Linux常用命令分类整理
linux·运维·数据库
Q741_1473 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(2) 作答语言:C/C++ 哈夫曼编码 LRU
c语言·数据库·c++·算法·笔试·哈夫曼编码·哈夫曼树
齐 飞3 小时前
快速删除mysql表中所有数据-TRUNCATE TABLE
数据库·mysql
想摆烂的不会研究的研究生3 小时前
每日八股——Redis(2)
数据库·redis·缓存
optimistic_chen3 小时前
【Redis系列】主从复制
linux·数据库·redis·缓存·中间件·命令行·主从复制
一个天蝎座 白勺 程序猿3 小时前
KingbaseES 处理 PL/SQL 运行时错误全解析:从异常捕获到异常处理的实践指南
数据库·sql·oracle·kingbasees