环境:.Net Core 3.1 (需要导入.Net MongoDB的驱动)

模型

   /// <summary>
/// 收藏
/// </summary>
public class CtStreetFollow
{
/// <summary>
/// 收藏人编号
/// </summary>
public long Id { get; set; } /// <summary>
/// 收藏
/// </summary>
public List<StreetFollow> StreetFollows { get; set; }
} /// <summary>
/// 收藏
/// </summary>
public class StreetFollow
{
/// <summary>
/// 尾货编号
/// </summary>
public long StreetId { get; set; } /// <summary>
/// 卖家编号
/// </summary>
public long UserId { get; set; } /// <summary>
/// 置顶
/// </summary>
public int Top { get; set; }
}

代码:

public async Task SetTop(long userId, List<long> productIds, bool isTop)
{
var bson = MakeUpdateParam("$set", nameof(CtStreetFollow.StreetFollows),
new[]
{
new KeyValuePair<string, object>(nameof(StreetFollow.Top),
),
});
await UpdateData(nameof(CtStreetFollow.StreetFollows), productIds, "$in", _collection, bson);
}
/// <summary>
/// 用户数据修改统一更新
/// </summary>
/// <returns></returns>
internal async Task UpdateData(string arrayName, List<long> productIds, string myOperator, IMongoCollection<CtStreetFollow> col, BsonDocument bson)
{
var filters = Builders<CtStreetFollow>.Filter.ElemMatch(arrayName, Builders<StreetFollow>.Filter.In(p => p.StreetId, productIds));
await col.UpdateManyAsync(filters, bson, new UpdateOptions
{
ArrayFilters = new List<ArrayFilterDefinition> { new BsonDocumentArrayFilterDefinition<CtStreetFollow>(MakeSimpleUpdateArrayFilter(nameof(StreetFollow.StreetId), productIds, myOperator))
}
});
} /// <summary>
/// 合成bson
/// </summary>
/// <returns></returns>
public BsonDocument MakeUpdateParam(string myOperator, string arrayField, KeyValuePair<string, object>[] innerFvs)
{ return new BsonDocument(new Dictionary<string, object>
{
{myOperator, new BsonDocument(innerFvs.ToDictionary(p=>$"{arrayField}.$[elem].{p.Key}", p=>p.Value))}
}); } /// <summary>
/// 构造简单的数组过滤BSON
/// 支持单字段,简单操作符
/// 数组子项别买
/// </summary>
/// <param name="field">数组子项中的字段</param>
/// <param name="value">字段值</param>
/// <param name="myOperator">简单操作符</param>
/// <returns></returns>
public BsonDocument MakeSimpleUpdateArrayFilter(string field, object value, string myOperator)
{ return new BsonDocument(new Dictionary<string, object>
{
{$"elem.{field}", new BsonDocument(new Dictionary<string, object>
{
{myOperator, value}
})}
});
}

.Net MongoDB批量修改集合中子集合的字段的更多相关文章

  1. mongodb 批量修改

    db.getCollection(').find({}).forEach( function(item) { item.date = item.date.replace("2018-11-2 ...

  2. SQL替换语句 批量修改、增加、删除字段内容

    sql替换语句,用该命令可以整批替换某字段的内容,也可以批量在原字段内容上加上或去掉字符. 命令总解:update 表的名称 set 此表要替换的字段名=REPLACE(此表要替换的字段名, '原来内 ...

  3. SQL替换语句之批量修改、增加、删除字段内容

    语法 REPLACE ( original-string, search-string, replace-string ) 用法 update 表的名称 set 替换字段=REPLACE(替换字段,原 ...

  4. sql取逗号前后数据与批量修改某一字段某一值

    sql取逗号后的值 SELECT SUBSTRING_INDEX(字段,) FROM 表名 sql取逗号前的值 SELECT SUBSTRING_INDEX(字段,) FROM 表名 批量修改 UPD ...

  5. C# 如何批量修改集合元素的属性值?

    我们往往会遇到要批量修改集合中元素的值,最笨的办法就是foreach循环,但本文介绍几种优雅的方法. 首先,我们准备好元素类和初始集合: 下面就是几种方法,目前并没有对性能做进一步的测试,有兴趣的童鞋 ...

  6. springmvc使用list集合实现商品列表的批量修改

    1将表单的数据绑定到List 1.1 需求 实现商品数据的批量修改. 1.2 需求分析 要想实现商品数据的批量修改,需要在商品列表中可以对商品信息进行修改,饼干且可以批量提交修改后的商品数据. 1.3 ...

  7. 【MongoDB】3.详细命令集合

    [注意:MongoDB自动将_id字段设置为主键] -------------------------------------------------------------------------- ...

  8. 【Mongodb】聚合查询 && 固定集合

    概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...

  9. MongoDB(4)- Collection 集合相关

    Collection MongoDB 将文档存储在集合中 集合存储在 Database 中 集合类似于关系数据库(Mysql)中的表 如果集合不存在,则 MongoDB 会在第一次存储该集合数据时创建 ...

随机推荐

  1. Python os.chmod() 方法

    概述 os.chmod() 方法用于更改文件或目录的权限.高佣联盟 www.cgewang.com 语法 chmod()方法语法格式如下: os.chmod(path, mode) 参数 path - ...

  2. PHP max() 函数

    实例 通过 max() 函数查找最大值: <?phpecho(max(2,4,6,8,10) . "<br>");echo(max(22,14,68,18,15) ...

  3. PHP md5_file() 函数

    实例 计算文本文件 "test.txt" 的 MD5 散列: <?php高佣联盟 www.cgewang.com$filename = "test.txt" ...

  4. PDOStatement::errorInfo

    PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 array ...

  5. 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换

    本文是精讲RestTemplate第2篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 RestTemplate只是对其他的HTTP客 ...

  6. JVM系列之:JIT中的Virtual Call接口

    目录 简介 最常用的接口List 多个List的调用 不一样的List调用 总结 简介 上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化. J ...

  7. 初步理解@Transactional注解

    在SSM项目中,经常在业务层的类或者方法上看到@Transactional注解,只是知道这个注解的作用是进行事务管理,但是具体有哪些属性,在什么情况下进行回滚,确是不那么清楚.所以在网上看了一些视频和 ...

  8. 痞子衡嵌入式:了解i.MXRTxxx系列ROM API及其与i.MXRT1xxx系列的差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM API设计细节. 痞子衡之前写过两篇文章 <利用i.MXRT1xxx系列ROM提供的FlexSPI ...

  9. 使用docker快速搭建hive环境

    记录一下使用docker快速搭建部署hive环境 目录 写在前面 步骤 安装docker 安装docker 安装docker-compose 配置docker国内镜像源(可选) 安装git & ...

  10. ACL权限管理 学习

    #查看权限 getfacl 文件名 例子:getfacl test 结果:# file: test# owner: root# group: rootuser::rw-group::r-xother: ...