.net core操作MongoDB
<h2 id="前言">前言</h2><p>现实中认识的一个搞java(<s>百万富婆</s>)的大佬,已经转行做抖音主播了,搞技术的只能赶在年前再水一篇博客,不足之处欢迎拍砖,以免误人子弟,呔,真是太难受了<br><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107170752864-1644844153.jpg" alt="image" loading="lazy"></p>
<h2 id="环境准备">环境准备</h2>
<blockquote>
<ul>
<li>.net core 3.1</li>
<li>MongoDB</li>
<li>Navicat Premium 16</li>
</ul>
</blockquote>
<h3 id="创建项目">创建项目</h3>
<blockquote>
<p>1.选择ASP.NET Core Web API 项目模板</p>
</blockquote>
<p><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107162958530-406321051.png" alt="image" class="medium-zoom-image" loading="lazy"></p>
<blockquote>
<p>2.配置项目信息 项目名称,项目路径</p>
</blockquote>
<p><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107163011158-173823834.png" alt="image" class="medium-zoom-image" loading="lazy"></p>
<blockquote>
<p>3.配置项目其它信息,这里选择使用.net core 3.1 不配置https</p>
</blockquote>
<p><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107163038480-1022864056.png" alt="image" class="medium-zoom-image" loading="lazy"></p>
<h3 id="添加依赖">添加依赖</h3>
<blockquote>
<p>1.获取MongoDB.Driver包 版本 2.18.0</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-xml">方案A. install-package MongoDB.Driver
方案B. nuget包管理工具搜索 MongoDB.Driver
方案C. 选中项目,双击,添加
<span class="hljs-tag"><<span class="hljs-name">ItemGroup>
<span class="hljs-tag"><<span class="hljs-name">PackageReference <span class="hljs-attr">Include=<span class="hljs-string">"MongoDB.Driver" <span class="hljs-attr">Version=<span class="hljs-string">"2.18.0" />
<span class="hljs-tag"></<span class="hljs-name">ItemGroup>
</span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="注册中间件">注册中间件</h3>
<blockquote>
<p>1.添加配置文件</p>
</blockquote>
<pre class="highlighter-hljs"><code class="language-json highlighter-hljs hljs"><span class="hljs-attr">"MongoDB"<span class="hljs-punctuation">: <span class="hljs-punctuation">{
<span class="hljs-attr">"ConnName"<span class="hljs-punctuation">: <span class="hljs-string">"mongodb://root:123456@127.0.0.1:27017/"<span class="hljs-punctuation">,
<span class="hljs-attr">"DatabaseName"<span class="hljs-punctuation">: <span class="hljs-string">"test"
<span class="hljs-punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>2.添加配置类</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">MongoDBConfig
{
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 连接字符串
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string ConnName { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 数据库名称
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string DatabaseName { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>3.注册配置文件与中间件</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-comment">//读取配置文件
<span class="hljs-keyword">var mongoDBOptions = Configuration.GetSection(<span class="hljs-string">"MongoDB").Get<MongoDBConfig>();
<span class="hljs-comment">//注册配置
services.Configure<MongoDBConfig>(<span class="hljs-keyword">this.Configuration.GetSection(<span class="hljs-string">"MongoDB"));
<span class="hljs-comment">//注册中间件
services.AddSingleton(<span class="hljs-keyword">new MongoClient(mongoDBOptions.ConnName));
</span></span></span></span></span></span></span></span></code></pre>
<p>其实就是注册了一个mongodb的客户端实例,然后用这个客户端实例来实现crud,如果你想优雅点(<s>强迫症</s>),也可以自定义一个拓展,来注册这个实例,这是一个通用技巧,后面使用到的类请<strong><span style="color: rgba(255, 0, 0, 1); font-size: medium">自行注册</span></strong></p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-keyword">class <span class="hljs-title">MongoDBExtensions
{
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-keyword">void <span class="hljs-title">AddMongoDB(<span class="hljs-params"><span class="hljs-keyword">this IServiceCollection services, Action<MongoDBConfig> setupAction)
{
<span class="hljs-keyword">if (setupAction == <span class="hljs-literal">null)
{
<span class="hljs-keyword">throw <span class="hljs-keyword">new ArgumentNullException(<span class="hljs-keyword">nameof(setupAction));
}
<span class="hljs-keyword">var options = <span class="hljs-keyword">new MongoDBConfig();
setupAction(options);
services.Configure(setupAction);
services.AddSingleton(services.AddSingleton(<span class="hljs-keyword">new MongoClient(options.ConnName)));
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>使用拓展,来注册中间件</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-javascript"><span class="hljs-keyword">var mongoDBOptions = <span class="hljs-title class_">Configuration.<span class="hljs-title class_">GetSection(<span class="hljs-string">"MongoDB").<span class="hljs-property">Get<<span class="hljs-title class_">MongoDBConfig>();
services.<span class="hljs-title class_">AddMongoDB(<span class="hljs-function"><span class="hljs-params">m =>
{
m.<span class="hljs-property">ConnName = mongoDBOptions.<span class="hljs-property">ConnName;
m.<span class="hljs-property">DatabaseName = mongoDBOptions.<span class="hljs-property">DatabaseName;
});
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="封装基础操作">封装基础操作</h3>
<p>最常用的办法,就是弄个DBHelper类,这种简单粗暴的方式,在.net core里使用并不优雅(<s>网上教程太多了,不想重复的水</s>),这里模拟常规的仓储模式,进行演示</p>
<blockquote>
<p>1.创建 Service,Repertoty,Model 文件夹<br>2.创建 BaseDbContext 类</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">BaseDbContext
{
<span class="hljs-keyword">private <span class="hljs-keyword">readonly IMongoDatabase _database;
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-title">BaseDbContext(<span class="hljs-params">MongoClient client, IOptions<MongoDBConfig> options)
{
<span class="hljs-comment">//决定使用哪个库
_database = client.GetDatabase(options.Value.DatabaseName);
}
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 数据库对象
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public IMongoDatabase MongoDatabase { <span class="hljs-keyword">get{ <span class="hljs-keyword">return _database; } }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如果项目只操作一个数据库,直接在基类里指定操作的数据库即可,如果需要操作多个数据库,可以再新建一个子类(TestDbContext),在子类里指定要操作的数据库<br>前面我已经注册了mongodb的客户端跟配置文件,所以在Startup类下,可以直接注册这个类,容器会自动管理这些依赖</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp">services.AddSingleton(<span class="hljs-keyword">typeof(BaseDbContext));
</span></code></pre>
<p>如果你想更优雅点(<s>强迫症</s>),可以创建一个IBaseDbContext 接口,在接口里定义相关的规范</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-xml">services.AddSingleton<span class="hljs-tag"><<span class="hljs-name">IBaseDbContext>();
</span></span></code></pre>
<blockquote>
<p>3.创建 BaseRepertoty 类</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-typescript"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title class_">BaseRepertoty<T> where T : <span class="hljs-keyword">class, <span class="hljs-title function_">new(<span class="hljs-params">)
{
<span class="hljs-keyword">private <span class="hljs-keyword">readonly <span class="hljs-title class_">IMongoDatabase _database;
<span class="hljs-keyword">private <span class="hljs-keyword">readonly <span class="hljs-built_in">string _collName;
<span class="hljs-keyword">public <span class="hljs-title class_">BaseRepertoty(<span class="hljs-title class_">BaseDbContext baseDbContext)
{
_database = baseDbContext.<span class="hljs-property">MongoDatabase;
_collName = <span class="hljs-title function_">typeof(T).<span class="hljs-title class_">GetAttributeValue(<span class="hljs-function">(<span class="hljs-params">TableAttribute m) => m.<span class="hljs-property">Name);
_collName = _collName ?? <span class="hljs-title function_">typeof(T).<span class="hljs-property">Name;
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>前面我们已经注册了BaseDbContext,它的主要作用是确定操作的库,那BaseRepertoty就是对具体集合(表)的操作,这里使用泛型,避免重复的CRUD操作<br>我新建了一个拓展,用于获取实体类上真实集合(表)的名称,如果用户没有指定,则取实体类的类名,做为集合(表)的名称</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-keyword">class <span class="hljs-title">AttributeExtensions
{
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">static TValue <span class="hljs-title">GetAttributeValue<<span class="hljs-title">TAttribute, <span class="hljs-title">TValue>(<span class="hljs-params">
<span class="hljs-keyword">this Type type,
Func<TAttribute, TValue> valueSelector)
<span class="hljs-keyword">where TAttribute : Attribute
{
<span class="hljs-keyword">var att = type.GetCustomAttributes(
<span class="hljs-keyword">typeof(TAttribute), <span class="hljs-literal">true
).FirstOrDefault() <span class="hljs-keyword">as TAttribute;
<span class="hljs-keyword">if (att != <span class="hljs-literal">null)
{
<span class="hljs-keyword">return valueSelector(att);
}
<span class="hljs-keyword">return <span class="hljs-literal">default(TValue);
}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>4.创建 UserInfoRepertoty 类</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-cpp"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title class_">UserInfoRepertoty : BaseRepertoty<UserInfo>
{
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-title">UserInfoRepertoty<span class="hljs-params">(BaseDbContext baseDbContext) : base(baseDbContext)
{
}
}
</span></span></span></span></span></span></span></code></pre>
<p>它的作用是指定操作具体的集合(表),这个类是非必须的,它只是指定了泛型的具体类型,也可以在server层调用的时候指定</p>
<blockquote>
<p>5.创建 UserInfo 实体类</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp">[<span class="hljs-meta">Table(<span class="hljs-string">"UserInfo")]
<span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">UserInfo
{
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 主键
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
[<span class="hljs-meta">BsonId]
<span class="hljs-keyword">public ObjectId Id { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 用户名
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string Name { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 年龄
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">int Age { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 创建时间
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
[<span class="hljs-meta">BsonDateTimeOptions(Kind = DateTimeKind.Local)]
<span class="hljs-keyword">public DateTime CreateTime { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 合作伙伴
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public List<Partner> PartnerList { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 其它信息
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public Info Info { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
}
<span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">Partner
{
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 伙伴名称
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string Name { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 合作状态
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">int? Status { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
}
<span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">Info
{
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 身份编码
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string Code { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 图片
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string Pic { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>mongodb里默认的主键是_id,它会自动生成,类型为ObjectId,强烈推荐使用自动生成,速度快,且能提供获取对应的时间戳的方法</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-python">ObjectId 类似唯一主键,可以很快的去生成和排序,包含 <span class="hljs-number">12 <span class="hljs-built_in">bytes,含义是:
前<span class="hljs-number">4个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 <span class="hljs-number">8 个小时
接下来的<span class="hljs-number">3个字节是机器标识码
紧接的两个字节由进程 <span class="hljs-built_in">id 组成 PID
最后三个字节是随机数
</span></span></span></span></span></span></code></pre>
<p>时间类型要做对应的处理,标记为当前时间</p>
<p>其它常用注解说明</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-mipsasm"><span class="hljs-keyword">BsonId修饰的字段对应BsonDocument中的_id;
<span class="hljs-keyword">BsonDefaultValue(value)用于指定默认值;
<span class="hljs-keyword">BsonIgnore表示不映射,即使BsonDocument中包含该字段也不会赋值给属性;
<span class="hljs-keyword">BsonExtraElements修饰的字段用于存储没有映射到类中的其他属性;
<span class="hljs-keyword">BsonElement可以指定修饰的属性映射到BsonDocument中的哪个字段;
</span></span></span></span></span></code></pre>
<p>使用mongodb的一个主要原因,就是它灵活的存储方式,类json,我们就来体验一番,基于这个模型来进行CRUD,我定义的类型如下,基本上能覆盖99%的使用场景</p>
<p>ObjectId (主键)<br>string (字符串)<br>int (数字)<br>object (对象)<br>array (数组)</p>
<p>我们在BaseRepertoty类里,实现CRUD,完整代码如下</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-swift"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title class_">BaseRepertoty<<span class="hljs-title class_">T> <span class="hljs-title class_">where <span class="hljs-title class_">T : <span class="hljs-title class_">class, <span class="hljs-title class_">new()
{
<span class="hljs-keyword">private readonly <span class="hljs-type">IMongoDatabase _database;
<span class="hljs-keyword">private readonly string _collName;
<span class="hljs-keyword">public <span class="hljs-type">BaseRepertoty(<span class="hljs-type">BaseDbContext baseDbContext)
{
_database <span class="hljs-operator">= baseDbContext.<span class="hljs-type">MongoDatabase;
_collName <span class="hljs-operator">= typeof(<span class="hljs-type">T).<span class="hljs-type">GetAttributeValue((<span class="hljs-type">TableAttribute m) <span class="hljs-operator">=> m.<span class="hljs-type">Name);
_collName <span class="hljs-operator">= _collName <span class="hljs-operator">?? typeof(<span class="hljs-type">T).<span class="hljs-type">Name;
}
#region <span class="hljs-type">Add 添加一条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 添加一条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="t">添加的实体</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public bool <span class="hljs-type">Add(<span class="hljs-type">T t)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
client.<span class="hljs-type">InsertOne(t);
<span class="hljs-keyword">return <span class="hljs-literal">true;
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">return <span class="hljs-literal">false;
}
}
#endregion
#region <span class="hljs-type">AddAsync 异步添加一条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步添加一条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="t">添加的实体</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<bool> <span class="hljs-type">AddAsync(<span class="hljs-type">T t)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">await client.<span class="hljs-type">InsertOneAsync(t);
<span class="hljs-keyword">return <span class="hljs-literal">true;
}
<span class="hljs-keyword">catch
{
<span class="hljs-keyword">return <span class="hljs-literal">false;
}
}
#endregion
#region <span class="hljs-type">InsertMany 批量插入
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 批量插入
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="t">实体集合</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public bool <span class="hljs-type">InsertMany(<span class="hljs-type">List<<span class="hljs-type">T> t)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
client.<span class="hljs-type">InsertMany(t);
<span class="hljs-keyword">return <span class="hljs-literal">true;
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">return <span class="hljs-literal">false;
}
}
#endregion
#region <span class="hljs-type">InsertManyAsync 异步批量插入
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步批量插入
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="t">实体集合</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<bool> <span class="hljs-type">InsertManyAsync(<span class="hljs-type">List<<span class="hljs-type">T> t)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">await client.<span class="hljs-type">InsertManyAsync(t);
<span class="hljs-keyword">return <span class="hljs-literal">true;
}
<span class="hljs-keyword">catch
{
<span class="hljs-keyword">return <span class="hljs-literal">false;
}
}
#endregion
#region <span class="hljs-type">UpdateOne 修改数据(单条)
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 批量修改数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="update">要修改的字段</param>
<span class="hljs-comment">/// <param name="filter">修改条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-type">UpdateResult <span class="hljs-type">UpdateOne(<span class="hljs-type">UpdateDefinition<<span class="hljs-type">T> update, <span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return client.<span class="hljs-type">UpdateOne(filter, update);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">UpdateOneAsync 异步批量修改数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步批量修改数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="update">要修改的字段</param>
<span class="hljs-comment">/// <param name="filter">修改条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<<span class="hljs-type">UpdateResult> <span class="hljs-type">UpdateOneAsync(<span class="hljs-type">UpdateDefinition<<span class="hljs-type">T> update, <span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return <span class="hljs-keyword">await client.<span class="hljs-type">UpdateOneAsync(filter, update);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">UpdateManay 批量修改数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 批量修改数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="update">要修改的字段</param>
<span class="hljs-comment">/// <param name="filter">修改条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-type">UpdateResult <span class="hljs-type">UpdateManay(<span class="hljs-type">UpdateDefinition<<span class="hljs-type">T> update, <span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">returnclient.<span class="hljs-type">UpdateMany(filter, update);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">UpdateManayAsync 异步批量修改数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步批量修改数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="update">要修改的字段</param>
<span class="hljs-comment">/// <param name="filter">修改条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<<span class="hljs-type">UpdateResult> <span class="hljs-type">UpdateManayAsync(<span class="hljs-type">UpdateDefinition<<span class="hljs-type">T> update, <span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return <span class="hljs-keyword">await client.<span class="hljs-type">UpdateManyAsync(filter, update);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">DeleteOne 删除一条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 删除多条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="filter">删除的条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-type">DeleteResult <span class="hljs-type">DeleteOne(<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return client.<span class="hljs-type">DeleteOne(filter);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">DeleteOneAsync 异步删除一条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步删除多条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="filter">删除的条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<<span class="hljs-type">DeleteResult> <span class="hljs-type">DeleteOneAsync(<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return <span class="hljs-keyword">await client.<span class="hljs-type">DeleteOneAsync(filter);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">DeleteMany 删除多条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 删除多条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="filter">删除的条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-type">DeleteResult <span class="hljs-type">DeleteMany(<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return client.<span class="hljs-type">DeleteMany(filter);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">DeleteManyAsync 异步删除多条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步删除多条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="filter">删除的条件</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<<span class="hljs-type">DeleteResult> <span class="hljs-type">DeleteManyAsync(<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-keyword">return <span class="hljs-keyword">await client.<span class="hljs-type">DeleteManyAsync(filter);
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">FindOne 根据id查询一条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 根据id查询一条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="id">objectid</param>
<span class="hljs-comment">/// <param name="field">要查询的字段,不写时查询全部</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-type">T <span class="hljs-type">FindOne(string id, bool isObjectId <span class="hljs-operator">= <span class="hljs-literal">true, string[] field <span class="hljs-operator">= null)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter;
<span class="hljs-keyword">if (isObjectId)
{
filter <span class="hljs-operator">= <span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Filter.<span class="hljs-type">Eq(<span class="hljs-string">"_id", new <span class="hljs-type">ObjectId(id));
}
<span class="hljs-keyword">else
{
filter <span class="hljs-operator">= <span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Filter.<span class="hljs-type">Eq(<span class="hljs-string">"_id", id);
}
<span class="hljs-comment">//不指定查询字段
<span class="hljs-keyword">if (field <span class="hljs-operator">== null <span class="hljs-operator">|| field.<span class="hljs-type">Length <span class="hljs-operator">== <span class="hljs-number">0)
{
<span class="hljs-keyword">return client.<span class="hljs-type">Find(filter).<span class="hljs-type">FirstOrDefault<<span class="hljs-type">T>();
}
<span class="hljs-comment">//制定查询字段
<span class="hljs-keyword">var fieldList <span class="hljs-operator">= new <span class="hljs-type">List<<span class="hljs-type">ProjectionDefinition<<span class="hljs-type">T>>();
<span class="hljs-keyword">for (int i <span class="hljs-operator">= <span class="hljs-number">0; i <span class="hljs-operator">< field.<span class="hljs-type">Length; i<span class="hljs-operator">++)
{
fieldList.<span class="hljs-type">Add(<span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Projection.<span class="hljs-type">Include(field.<span class="hljs-type">ToString()));
}
<span class="hljs-keyword">var projection <span class="hljs-operator">= <span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Projection.<span class="hljs-type">Combine(fieldList);
fieldList<span class="hljs-operator">?.<span class="hljs-type">Clear();
<span class="hljs-keyword">return client.<span class="hljs-type">Find(filter).<span class="hljs-type">Project<<span class="hljs-type">T>(projection).<span class="hljs-type">FirstOrDefault<<span class="hljs-type">T>();
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">FindOneAsync 异步根据id查询一条数据
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 异步根据id查询一条数据
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="id">objectid</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-type">Task<<span class="hljs-type">T> <span class="hljs-type">FindOneAsync(string id, bool isObjectId <span class="hljs-operator">= <span class="hljs-literal">true, string[] field <span class="hljs-operator">= null)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter;
<span class="hljs-keyword">if (isObjectId)
{
filter <span class="hljs-operator">= <span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Filter.<span class="hljs-type">Eq(<span class="hljs-string">"_id", new <span class="hljs-type">ObjectId(id));
}
<span class="hljs-keyword">else
{
filter <span class="hljs-operator">= <span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Filter.<span class="hljs-type">Eq(<span class="hljs-string">"_id", id);
}
<span class="hljs-comment">//不指定查询字段
<span class="hljs-keyword">if (field <span class="hljs-operator">== null <span class="hljs-operator">|| field.<span class="hljs-type">Length <span class="hljs-operator">== <span class="hljs-number">0)
{
<span class="hljs-keyword">return <span class="hljs-keyword">await client.<span class="hljs-type">Find(filter).<span class="hljs-type">FirstOrDefaultAsync();
}
<span class="hljs-comment">//制定查询字段
<span class="hljs-keyword">var fieldList <span class="hljs-operator">= new <span class="hljs-type">List<<span class="hljs-type">ProjectionDefinition<<span class="hljs-type">T>>();
<span class="hljs-keyword">for (int i <span class="hljs-operator">= <span class="hljs-number">0; i <span class="hljs-operator">< field.<span class="hljs-type">Length; i<span class="hljs-operator">++)
{
fieldList.<span class="hljs-type">Add(<span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Projection.<span class="hljs-type">Include(field.<span class="hljs-type">ToString()));
}
<span class="hljs-keyword">var projection <span class="hljs-operator">= <span class="hljs-type">Builders<<span class="hljs-type">T>.<span class="hljs-type">Projection.<span class="hljs-type">Combine(fieldList);
fieldList<span class="hljs-operator">?.<span class="hljs-type">Clear();
<span class="hljs-keyword">return <span class="hljs-keyword">await client.<span class="hljs-type">Find(filter).<span class="hljs-type">Project<<span class="hljs-type">T>(projection).<span class="hljs-type">FirstOrDefaultAsync();
}
<span class="hljs-keyword">catch (<span class="hljs-type">Exception ex)
{
<span class="hljs-keyword">throw ex;
}
}
#endregion
#region <span class="hljs-type">FindList 查询集合
<span class="hljs-comment">/// <summary>
<span class="hljs-comment">/// 查询集合
<span class="hljs-comment">/// </summary>
<span class="hljs-comment">/// <param name="filter">查询条件</param>
<span class="hljs-comment">/// <param name="field">要查询的字段,不写时查询全部</param>
<span class="hljs-comment">/// <param name="sort">要排序的字段</param>
<span class="hljs-comment">/// <returns></returns>
<span class="hljs-keyword">public <span class="hljs-type">List<<span class="hljs-type">T> <span class="hljs-type">FindList(<span class="hljs-type">FilterDefinition<<span class="hljs-type">T> filter, string[] field <span class="hljs-operator">= null, <span class="hljs-type">SortDefinition<<span class="hljs-type">T> sort <span class="hljs-operator">= null)
{
<span class="hljs-keyword">try
{
<span class="hljs-keyword">var client <span class="hljs-operator">= _database.<span class="hljs-type">GetCollection<<span class="hljs-type">T>(_collName);
<span class="hljs-comment">//不指定查询字段
<span class="hljs-keyword">if (field <span class="hljs-operator">== null <span class="hljs-operator">|| field.<span class="hljs-type">Length <span class="hljs-operator">== <span class="hljs-number">0)
{
<span class="hljs-keyword">if (sort <span class="hljs-operator">== null) <span class="hljs-keyword">return client.<span class="hljs-type">Find(filter).<span class="hljs-type">ToList();
<span class="hljs-comment">//进行排序
<span class="hljs-keyword">return client.<span class="hljs-type">Find(filter).<span class="hljs-type">Sort(sort).</span><span class="hljs-type">ToList();
}
</span><span class="hljs-comment">//制定查询字段
</span><span class="hljs-keyword">var fieldList </span><span class="hljs-operator">= new </span><span class="hljs-type">List<</span><span class="hljs-type">ProjectionDefinition<</span><span class="hljs-type">T>>();
</span><span class="hljs-keyword">for (int i </span><span class="hljs-operator">= </span><span class="hljs-number">0; i </span><span class="hljs-operator">< field.</span><span class="hljs-type">Length; i</span><span class="hljs-operator">++)
{
fieldList.</span><span class="hljs-type">Add(</span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Include(field.</span><span class="hljs-type">ToString()));
}
</span><span class="hljs-keyword">var projection </span><span class="hljs-operator">= </span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Combine(fieldList);
fieldList</span><span class="hljs-operator">?.</span><span class="hljs-type">Clear();
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">ToList();
</span><span class="hljs-comment">//排序查询
</span><span class="hljs-keyword">return client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">ToList();
}
</span><span class="hljs-keyword">catch (</span><span class="hljs-type">Exception ex)
{
</span><span class="hljs-keyword">throw ex;
}
}
#endregion
#region </span><span class="hljs-type">FindListAsync 异步查询集合
</span><span class="hljs-comment">/// <summary>
</span><span class="hljs-comment">/// 异步查询集合
</span><span class="hljs-comment">/// </summary>
</span><span class="hljs-comment">/// <param name="filter">查询条件</param>
</span><span class="hljs-comment">/// <param name="field">要查询的字段,不写时查询全部</param>
</span><span class="hljs-comment">/// <param name="sort">要排序的字段</param>
</span><span class="hljs-comment">/// <returns></returns>
</span><span class="hljs-keyword">public </span><span class="hljs-keyword">async </span><span class="hljs-type">Task<</span><span class="hljs-type">List<</span><span class="hljs-type">T>> </span><span class="hljs-type">FindListAsync(</span><span class="hljs-type">FilterDefinition<</span><span class="hljs-type">T> filter, string[] field </span><span class="hljs-operator">= null, </span><span class="hljs-type">SortDefinition<</span><span class="hljs-type">T> sort </span><span class="hljs-operator">= null)
{
</span><span class="hljs-keyword">try
{
</span><span class="hljs-keyword">var client </span><span class="hljs-operator">= _database.</span><span class="hljs-type">GetCollection<</span><span class="hljs-type">T>(_collName);
</span><span class="hljs-comment">//不指定查询字段
</span><span class="hljs-keyword">if (field </span><span class="hljs-operator">== null </span><span class="hljs-operator">|| field.</span><span class="hljs-type">Length </span><span class="hljs-operator">== </span><span class="hljs-number">0)
{
</span><span class="hljs-comment">//return await client.Find(new BsonDocument()).ToListAsync();
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">ToListAsync();
</span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">ToListAsync();
}
</span><span class="hljs-comment">//制定查询字段
</span><span class="hljs-keyword">var fieldList </span><span class="hljs-operator">= new </span><span class="hljs-type">List<</span><span class="hljs-type">ProjectionDefinition<</span><span class="hljs-type">T>>();
</span><span class="hljs-keyword">for (int i </span><span class="hljs-operator">= </span><span class="hljs-number">0; i </span><span class="hljs-operator">< field.</span><span class="hljs-type">Length; i</span><span class="hljs-operator">++)
{
fieldList.</span><span class="hljs-type">Add(</span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Include(field.</span><span class="hljs-type">ToString()));
}
</span><span class="hljs-keyword">var projection </span><span class="hljs-operator">= </span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Combine(fieldList);
fieldList</span><span class="hljs-operator">?.</span><span class="hljs-type">Clear();
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">ToListAsync();
</span><span class="hljs-comment">//排序查询
</span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">ToListAsync();
}
</span><span class="hljs-keyword">catch (</span><span class="hljs-type">Exception ex)
{
</span><span class="hljs-keyword">throw ex;
}
}
#endregion
#region </span><span class="hljs-type">FindListByPage 分页查询集合
</span><span class="hljs-comment">/// <summary>
</span><span class="hljs-comment">/// 分页查询集合
</span><span class="hljs-comment">/// </summary>
</span><span class="hljs-comment">/// <param name="filter">查询条件</param>
</span><span class="hljs-comment">/// <param name="pageIndex">当前页</param>
</span><span class="hljs-comment">/// <param name="pageSize">页容量</param>
</span><span class="hljs-comment">/// <param name="count">总条数</param>
</span><span class="hljs-comment">/// <param name="field">要查询的字段,不写时查询全部</param>
</span><span class="hljs-comment">/// <param name="sort">要排序的字段</param>
</span><span class="hljs-comment">/// <returns></returns>
</span><span class="hljs-keyword">public </span><span class="hljs-type">List<</span><span class="hljs-type">T> </span><span class="hljs-type">FindListByPage(</span><span class="hljs-type">FilterDefinition<</span><span class="hljs-type">T> filter, int pageIndex, int pageSize, out long count, string[] field </span><span class="hljs-operator">= null, </span><span class="hljs-type">SortDefinition<</span><span class="hljs-type">T> sort </span><span class="hljs-operator">= null)
{
</span><span class="hljs-keyword">try
{
</span><span class="hljs-keyword">var client </span><span class="hljs-operator">= _database.</span><span class="hljs-type">GetCollection<</span><span class="hljs-type">T>(_collName);
count </span><span class="hljs-operator">= client.</span><span class="hljs-type">CountDocuments(filter);
</span><span class="hljs-comment">//不指定查询字段
</span><span class="hljs-keyword">if (field </span><span class="hljs-operator">== null </span><span class="hljs-operator">|| field.</span><span class="hljs-type">Length </span><span class="hljs-operator">== </span><span class="hljs-number">0)
{
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToList();
</span><span class="hljs-comment">//进行排序
</span><span class="hljs-keyword">return client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToList();
}
</span><span class="hljs-comment">//制定查询字段
</span><span class="hljs-keyword">var fieldList </span><span class="hljs-operator">= new </span><span class="hljs-type">List<</span><span class="hljs-type">ProjectionDefinition<</span><span class="hljs-type">T>>();
</span><span class="hljs-keyword">for (int i </span><span class="hljs-operator">= </span><span class="hljs-number">0; i </span><span class="hljs-operator">< field.</span><span class="hljs-type">Length; i</span><span class="hljs-operator">++)
{
fieldList.</span><span class="hljs-type">Add(</span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Include(field.</span><span class="hljs-type">ToString()));
}
</span><span class="hljs-keyword">var projection </span><span class="hljs-operator">= </span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Combine(fieldList);
fieldList</span><span class="hljs-operator">?.</span><span class="hljs-type">Clear();
</span><span class="hljs-comment">//不排序
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToList();
</span><span class="hljs-comment">//排序查询
</span><span class="hljs-keyword">return client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToList();
}
</span><span class="hljs-keyword">catch (</span><span class="hljs-type">Exception ex)
{
</span><span class="hljs-keyword">throw ex;
}
}
#endregion
#region </span><span class="hljs-type">FindListByPageAsync 异步分页查询集合
</span><span class="hljs-comment">/// <summary>
</span><span class="hljs-comment">/// 异步分页查询集合
</span><span class="hljs-comment">/// </summary>
</span><span class="hljs-comment">/// <param name="filter">查询条件</param>
</span><span class="hljs-comment">/// <param name="pageIndex">当前页</param>
</span><span class="hljs-comment">/// <param name="pageSize">页容量</param>
</span><span class="hljs-comment">/// <param name="field">要查询的字段,不写时查询全部</param>
</span><span class="hljs-comment">/// <param name="sort">要排序的字段</param>
</span><span class="hljs-comment">/// <returns></returns>
</span><span class="hljs-keyword">public </span><span class="hljs-keyword">async </span><span class="hljs-type">Task<</span><span class="hljs-type">List<</span><span class="hljs-type">T>> </span><span class="hljs-type">FindListByPageAsync(</span><span class="hljs-type">FilterDefinition<</span><span class="hljs-type">T> filter, int pageIndex, int pageSize, string[] field </span><span class="hljs-operator">= null, </span><span class="hljs-type">SortDefinition<</span><span class="hljs-type">T> sort </span><span class="hljs-operator">= null)
{
</span><span class="hljs-keyword">try
{
</span><span class="hljs-keyword">var client </span><span class="hljs-operator">= _database.</span><span class="hljs-type">GetCollection<</span><span class="hljs-type">T>(_collName);
</span><span class="hljs-comment">//不指定查询字段
</span><span class="hljs-keyword">if (field </span><span class="hljs-operator">== null </span><span class="hljs-operator">|| field.</span><span class="hljs-type">Length </span><span class="hljs-operator">== </span><span class="hljs-number">0)
{
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToListAsync();
</span><span class="hljs-comment">//进行排序
</span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToListAsync();
}
</span><span class="hljs-comment">//制定查询字段
</span><span class="hljs-keyword">var fieldList </span><span class="hljs-operator">= new </span><span class="hljs-type">List<</span><span class="hljs-type">ProjectionDefinition<</span><span class="hljs-type">T>>();
</span><span class="hljs-keyword">for (int i </span><span class="hljs-operator">= </span><span class="hljs-number">0; i </span><span class="hljs-operator">< field.</span><span class="hljs-type">Length; i</span><span class="hljs-operator">++)
{
fieldList.</span><span class="hljs-type">Add(</span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Include(field.</span><span class="hljs-type">ToString()));
}
</span><span class="hljs-keyword">var projection </span><span class="hljs-operator">= </span><span class="hljs-type">Builders<</span><span class="hljs-type">T>.</span><span class="hljs-type">Projection.</span><span class="hljs-type">Combine(fieldList);
fieldList</span><span class="hljs-operator">?.</span><span class="hljs-type">Clear();
</span><span class="hljs-comment">//不排序
</span><span class="hljs-keyword">if (sort </span><span class="hljs-operator">== null) </span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToListAsync();
</span><span class="hljs-comment">//排序查询
</span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">Find(filter).</span><span class="hljs-type">Sort(sort).</span><span class="hljs-type">Project<</span><span class="hljs-type">T>(projection).</span><span class="hljs-type">Skip((pageIndex </span><span class="hljs-operator">- </span><span class="hljs-number">1) </span><span class="hljs-operator">* pageSize).</span><span class="hljs-type">Limit(pageSize).</span><span class="hljs-type">ToListAsync();
}
</span><span class="hljs-keyword">catch (</span><span class="hljs-type">Exception ex)
{
</span><span class="hljs-keyword">throw ex;
}
}
#endregion
#region </span><span class="hljs-type">Count 根据条件获取总数
</span><span class="hljs-comment">/// <summary>
</span><span class="hljs-comment">/// 根据条件获取总数
</span><span class="hljs-comment">/// </summary>
</span><span class="hljs-comment">/// <param name="filter">条件</param>
</span><span class="hljs-comment">/// <returns></returns>
</span><span class="hljs-keyword">public long </span><span class="hljs-type">Count(</span><span class="hljs-type">FilterDefinition<</span><span class="hljs-type">T> filter)
{
</span><span class="hljs-keyword">try
{
</span><span class="hljs-keyword">var client </span><span class="hljs-operator">= _database.</span><span class="hljs-type">GetCollection<</span><span class="hljs-type">T>(_collName);
</span><span class="hljs-keyword">return client.</span><span class="hljs-type">CountDocuments(filter);
}
</span><span class="hljs-keyword">catch (</span><span class="hljs-type">Exception ex)
{
</span><span class="hljs-keyword">throw ex;
}
}
#endregion
#region </span><span class="hljs-type">CountAsync 异步根据条件获取总数
</span><span class="hljs-comment">/// <summary>
</span><span class="hljs-comment">/// 异步根据条件获取总数
</span><span class="hljs-comment">/// </summary>
</span><span class="hljs-comment">/// <param name="filter">条件</param>
</span><span class="hljs-comment">/// <returns></returns>
</span><span class="hljs-keyword">public </span><span class="hljs-keyword">async </span><span class="hljs-type">Task<long> </span><span class="hljs-type">CountAsync(</span><span class="hljs-type">FilterDefinition<</span><span class="hljs-type">T> filter)
{
</span><span class="hljs-keyword">try
{
</span><span class="hljs-keyword">var client </span><span class="hljs-operator">= _database.</span><span class="hljs-type">GetCollection<</span><span class="hljs-type">T>(_collName);
</span><span class="hljs-keyword">return </span><span class="hljs-keyword">await client.</span><span class="hljs-type">CountDocumentsAsync(filter);
}
</span><span class="hljs-keyword">catch (</span><span class="hljs-type">Exception ex)
{
</span><span class="hljs-keyword">throw ex;
}
}
#endregion
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>6.创建 UserInfoService 类</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">UserInfoService
{
<span class="hljs-keyword">private <span class="hljs-keyword">readonly UserInfoRepertoty _userInfoRepertoty;
<span class="hljs-keyword">private <span class="hljs-keyword">readonly FilterDefinitionBuilder<UserInfo> _buildFilter;
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-title">UserInfoService(<span class="hljs-params">UserInfoRepertoty userInfoRepertoty)
{
_userInfoRepertoty = userInfoRepertoty;
_buildFilter = Builders<UserInfo>.Filter;
}
}
</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>体验mongodb独特的使用方式,这里挑出两个具有代表性的操作进行讲解,测试数据<br><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107164902002-418256653.png" alt="image" class="medium-zoom-image" loading="lazy"></p>
<p><strong>分页查询集合(表)</strong></p>
<ul>
<li>1.动态条件查询</li>
<li>2.查询文档指定字段</li>
<li>3.排序</li>
<li>4.分页</li>
</ul>
<p>定义查询操作</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-xml">FilterDefinition<span class="hljs-tag"><<span class="hljs-name">UserInfo> filter = _buildFilter.Empty;
</span></span></code></pre>
<p>查询条件由查询条件构造器构建,这个地方网上很多示例写的有bug,当查询所有集合(表)数据的时候,<strong><span style="color: rgba(255, 0, 0, 1); font-size: medium">filter = null</span></strong> 在转换的时候会抛出异常</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-perl">//创建查询条件构造器
FilterDefinitionBuilder<UserInfo> _buildFilter = Builders<UserInfo>.Filter;
<span class="hljs-regexp">//定义查询条件
FilterDefinition<UserInfo> filter = null;
<span class="hljs-keyword">if(!string.IsNullOrEmpty(request.Name)) filter = _buildFilter.E<span class="hljs-string">q(m => m.Name, request.Name);
</span></span></span></code></pre>
<p>这里有很多种类型的构造器,对应不同的操作</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-swift"><span class="hljs-comment">//排序操作
<span class="hljs-type">SortDefinition<<span class="hljs-type">UserInfo> sort
<span class="hljs-comment">//排序构造器
<span class="hljs-type">Builders<<span class="hljs-type">UserInfo>.<span class="hljs-type">Sort
修改操作
<span class="hljs-type">UpdateDefinition<<span class="hljs-type">UserInfo> update
<span class="hljs-comment">//修改构造器
<span class="hljs-type">Builders<<span class="hljs-type">UserInfo>.<span class="hljs-type">Update
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>完整的查询示例,比较麻烦的地方,是针对数组的条件查询,如果嵌套的层数比较多,查询也是同理的套娃查询</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">GetUserListRequest
{
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 名称
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">string Name { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 年龄
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public <span class="hljs-built_in">int? Age { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 创建时间
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public DateTime CreateTime { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 合作伙伴
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public Partner PartnerList { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"><summary>
<span class="hljs-comment"><span class="hljs-doctag">/// 信息
<span class="hljs-comment"><span class="hljs-doctag">/// <span class="hljs-doctag"></summary>
<span class="hljs-keyword">public Info Info { <span class="hljs-keyword">get; <span class="hljs-keyword">set; }
}
<span class="hljs-keyword">public <span class="hljs-keyword">async Task<List<UserInfo>> GetUserPageList(GetUserListRequest request)
{
<span class="hljs-keyword">if (request == <span class="hljs-literal">null) <span class="hljs-keyword">return <span class="hljs-keyword">new List<UserInfo>();
FilterDefinition<UserInfo> filter = _buildFilter.Empty;
SortDefinition<UserInfo> sort = Builders<UserInfo>.Sort.Ascending(m => m.Age);
<span class="hljs-keyword">if (!<span class="hljs-built_in">string.IsNullOrEmpty(request.Name))
{
filter = _buildFilter.Eq(m => m.Name, request.Name);
}
<span class="hljs-keyword">if (request.Age.HasValue)
{
filter = _buildFilter.Eq(m => m.Age, request.Age);
}
<span class="hljs-keyword">if (request.PartnerList != <span class="hljs-literal">null)
{
<span class="hljs-keyword">if (request.PartnerList.Status.HasValue)
{
filter = _buildFilter.ElemMatch(<span class="hljs-string">"PartnerList", Builders<Partner>.Filter.Eq(m => m.Status, request.PartnerList.Status));
}
}
<span class="hljs-keyword">if (request.Info != <span class="hljs-literal">null)
{
<span class="hljs-keyword">if (!<span class="hljs-built_in">string.IsNullOrEmpty(request.Info.Code))
{
filter = _buildFilter.Eq(m => m.Info.Code, request.Info.Code);
}
}
<span class="hljs-keyword">var list = <span class="hljs-keyword">await _userInfoRepertoty.FindListByPageAsync(filter,<span class="hljs-number">1,<span class="hljs-number">3, <span class="hljs-keyword">new <span class="hljs-built_in">string[] { <span class="hljs-string">"Name",<span class="hljs-string">"Age", <span class="hljs-string">"CreateTime" }, sort);
<span class="hljs-keyword">return list;
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>
<p>动态条件查询(查询全部)</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">var list = <span class="hljs-keyword">await _userInfoRepertoty.FindListByPageAsync(filter, <span class="hljs-number">1, <span class="hljs-number">30);
</span></span></span></span></code></pre>
<p><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107165330867-1282156814.png" alt="image" class="medium-zoom-image" loading="lazy"></p>
<blockquote>
<p>条件查询,排序,分页,查询指定字段</p>
</blockquote>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-csharp"><span class="hljs-keyword">var list = <span class="hljs-keyword">await _userInfoRepertoty.FindListByPageAsync(filter,<span class="hljs-number">1,<span class="hljs-number">3, <span class="hljs-keyword">new <span class="hljs-built_in">string[] { <span class="hljs-string">"Name",<span class="hljs-string">"Age", <span class="hljs-string">"CreateTime" }, sort);
</span></span></span></span></span></span></span></span></span></code></pre>
<p><img src="https://img2023.cnblogs.com/blog/772322/202301/772322-20230107170055863-885107849.png" alt="image" class="medium-zoom-image" loading="lazy"><br>除了使用对象模型进行操作,也可以直接使用mongodb原生的BsonDocument进行操作</p>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-mipsasm">var <span class="hljs-keyword">buildFilter = <span class="hljs-keyword">Builders<BsonDocument>.Filter;
FilterDefinition<<span class="hljs-keyword">BsonDocument> filter = _buildFilter.Empty<span class="hljs-comment">;;
<span class="hljs-keyword">BsonDocument <span class="hljs-keyword">bson = new <span class="hljs-keyword">BsonDocument
{
{ <span class="hljs-string">"Age",<span class="hljs-number">20},
{<span class="hljs-string">"Info.Status",<span class="hljs-number">3 }
};
foreach (var <span class="hljs-keyword">bs in <span class="hljs-keyword">bson)
{
filter = _buildFilter.Eq(<span class="hljs-keyword">bs.Name, <span class="hljs-keyword">bs.Value);
}
var sort = <span class="hljs-keyword">Builders<BsonDocument>.Sort;
var list = await collection.Find(filter).Sort(sort.Descending(<span class="hljs-string">"age")).ToListAsync();
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>修改集合(表)的数据</strong></p>
<ul>
<li>1.修改满足条件的文档</li>
<li>2.修改文档的部分字段</li>
</ul>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-typescript"><span class="hljs-keyword">public <span class="hljs-keyword">async <span class="hljs-title class_">Task <span class="hljs-title class_">UpdateUserInfo()
{
<span class="hljs-comment">//修改条件
<span class="hljs-title class_">FilterDefinition<<span class="hljs-title class_">UserInfo> filter = _buildFilter.<span class="hljs-property">Empty;
filter = _buildFilter.<span class="hljs-title class_">Eq(<span class="hljs-function"><span class="hljs-params">m => m.<span class="hljs-property">Name, <span class="hljs-string">"tibos");
filter = _buildFilter.<span class="hljs-title class_">ElemMatch(<span class="hljs-function"><span class="hljs-params">list => list.<span class="hljs-property">PartnerList, <span class="hljs-function"><span class="hljs-params">child => child.<span class="hljs-property">Status == <span class="hljs-number">1);
<span class="hljs-comment">//修改字段
<span class="hljs-keyword">var update = <span class="hljs-title class_">Builders<<span class="hljs-title class_">UserInfo>.<span class="hljs-property">Update.<span class="hljs-title class_">Set(<span class="hljs-string">"Age",<span class="hljs-number">100).<span class="hljs-title class_">Set(<span class="hljs-string">"PartnerList.$.Name", <span class="hljs-string">"ppp").<span class="hljs-title class_">Set(<span class="hljs-string">"PartnerList.$.Status", <span class="hljs-string">"");
<span class="hljs-keyword">await _userInfoRepertoty.<span class="hljs-title class_">UpdateManayAsync(update, filter);
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre><br><br>
来源:https://www.cnblogs.com/wl-blog/p/17073022.html
頁:
[1]