迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MongoDB >

向 MongoDB 集合中的每个文档添加新字段

作者:迹忆客 最近更新:2023/04/21 浏览次数:

本文将讨论 $set$setOnInsert 操作。 此外,MongoDB中集合中添加字段的问题也使用这两个操作符进行了简要说明。


MongoDB 中的 $set 运算符

$set 运算符将字段的值更改为提供的值。 $set 运算符表达式如下所示:{ $set: { <field1>: <value1>, ... } }

使用点符号在嵌入文本或数组中定义 <field>

$set 运算符的行为

从 MongoDB 5.0 开始,更新运算符以字典顺序处理具有基于字符串的名称的文档字段。 以数字命名的字段按数字顺序处理。

如果该字段不存在,$set 将创建一个具有请求值的字段,只要新字段不打破类型限制。 如果您为不存在的字段提供点路径,$set 将根据需要构造嵌入文档以完成点路径。

如果您提供多个字段值对,$set 将更新或创建每个字段。

当您在 MongoDB 5.0 中使用带有空操作数表达式 ({}) 的 $set 等更新运算符时,mongod 不再抛出错误。 由于更新为空,因此没有修改,也没有产生 oplog 记录(意味着该操作是空操作)。

例如,让我们创建衣服系列:

db.clothes.insertOne(
   {
     _id: 100,
     quantity: 250,
     instock: true,
     reorder: false,
     details: { model: "14RR", make: "Clothes" },
     tags: [ "apparel", "clothing" ],
     ratings: [ { by: "Customer127", rating: 5 } ]
   }
)

设置顶级字段 以下过程使用 $set 运算符更改满足条件 _id 等于 100 的文档的数量、详细信息和标签字段的值。

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        quantity: 400,
        details: { model: "2600", make: "Fashionables" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

该操作更新以下内容:

  1. 数量值到 400。
  2. 新嵌入文档的详细信息字段。
  3. 使用新数组标记字段。

该文档现在具有以下值:

{
  _id: 100,
  quantity: 400,
  instock: true,
  reorder: false,
  details: { model: '2600', make: 'Fashionables' },
  tags: [ 'coats', 'outerwear', 'clothing' ],
  ratings: [ { by: 'Customer127', rating: 5 } ]
}

在嵌入式文档中设置字段

使用点符号表示嵌入文本或数组中的 <field>。 以下操作修改满足条件 _id 等于 100 的文档的详细信息文档中的 make 字段:

db.clothes.updateOne(
   { _id: 100 },
   { $set: { "details.make": "Kidz" } }
)

更新后,文档现在具有以下值:

在嵌入式文档中设置字段 - 输出

设置数组中的元素

使用点符号表示嵌入文本或数组中的 <field>

以下操作修改 tags 字段中的值第二个元素和 ratings 数组第一个元素中的 ratings 字段,以满足条件 _id 等于 100 的文档。

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        "tags.1": "rain wear",
        "ratings.0.rating": 3
      }
   }
)

更新后,文档现在具有以下值:

设置数组中的元素 - 输出


MongoDB 中的 $setOnInsert 运算符

如果文档由于更新操作而插入,upsert: true ,则 $setOnInsert 将提供的值应用于文档中的字段。 如果更新操作没有导致插入,**$setOnInsert** 什么都不做。

可以指定 ups****ert 选项。

$setOnInsert 运算符的行为

从 MongoDB 5.0 开始,更新运算符以字典顺序处理具有基于字符串的名称的文档字段。 以数字命名的字段按数字顺序处理。

当您在 MongoDB 5.0 中使用带有空操作数表达式 ({}) 的 $setOnInsert 等更新运算符时,mongod 不再抛出错误。 由于更新为空,因此没有修改,也没有产生 oplog 记录(意味着该操作是空操作)。

例如,衣服集合不包含文档。 我们将使用带有 upsert: true 参数的 db.collection.updateOne() 插入一个新文档。

db.clothes.updateOne(
  { _id: 1 },
  {
     $set: { item: "banana" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

<query> 被 MongoDB 使用来创建一个带有 _id: 1 标识符的新文档。 $setOnInsert 对文档进行请求的更改。

在衣服集合中找到新插入的文件:

{ "_id" : 1, "item" : "banana", "defaultQty" : 100 }

当 upsert 参数为真时,db.collection.updateOne() 方法:

  1. 创建一个新文档,
  2. 应用 $set 操作,
  3. 应用 $setOnInsert 操作。

如果 db.collection.updateOne() 与现有文档匹配,MongoDB 仅应用 $set 操作。


向 MongoDB 集合中的文档添加新字段

您可以使用以下方法为 MongoDB 集合中的每个文档添加一个新字段。

还显示了将每种方法与具有以下文档的收集团队一起使用的示例:

db.teams.insertOne({team: "United", position: "Defence", points: 31})
db.teams.insertOne({team: "Spurs", position: "Defence", points: 22})
db.teams.insertOne({team: "Palace", position: "Center", points: 19})
db.teams.insertOne({team: "Eagles", position: "Forward", points: 26})
db.teams.insertOne({team: "Lions", position: "Defence", points: 33})

添加没有值的新字段

句法:

db.collection.updateMany({}, {$set:{"new_field": null}})

您可以使用以下代码向集合中的每个现有文档添加一个名为 rebounds 且值为空的新字段:

db.teams.updateMany({}, {$set:{"rebounds": null}})

您可以编写以下查询来查看前几个更新的文档:

db.teams.find().limit(3)

此查询返回以下文档:

添加没有值的新字段 - 输出

添加具有特定值的新字段

句法:

db.collection.updateMany({}, {$set:{"new_field": 10}})

您可以使用以下代码向集合中的每个现有文档添加一个值为 10 的名为 rebounds 的新字段:

db.teams.updateMany({}, {$set:{"rebounds": 10}})

您可以编写以下查询来查看前几个更新的文档:

db.teams.find().limit(3)

此查询返回以下文档:

添加具有特定值的新字段 - 输出

使用现有字段中的值添加新字段

句法:

db.collection.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
    ]
)

您可以使用以下代码添加一个名为 name 的字段,其值是现有字段 team 和 position 的串联。

db.teams.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
    ]
)

您可以编写以下查询来查看前几个更新的文档:

db.teams.find().limit(3)

此查询返回以下文档:

使用现有字段中的值添加新字段 - 输出

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 MongoDB Shell 中列出所有数据库

发布时间:2023/05/11 浏览次数:180 分类:MongoDB

交互式 Mongo Shell 提供了多个用于获取数据的选项。 本文介绍了在 Mongo Shell 中列出数据库的几种不同方法。

MongoDB 中检查字段包含的字符串

发布时间:2023/05/11 浏览次数:1024 分类:MongoDB

这篇文章解决了如何在 MongoDB 中使用正则表达式来确定字段是否包含字符串。在 MongoDB 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。

在 MongoDB 中 upsert 更新插入

发布时间:2023/05/11 浏览次数:214 分类:MongoDB

在 MongoDB 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findAndModify() 操作中使用。MongoDB 中的 upsert 查询 upsert 采用单个布尔参数。

如何卸载 MongoDB

发布时间:2023/05/11 浏览次数:745 分类:MongoDB

要从您的计算机中卸载 MongoDB,您必须先删除 MongoDB 服务、数据库和日志文件。使用这篇 MongoDB 文章,您将能够从 Ubuntu Linux、Mac 和 Windows 卸载 MongoDB。 请务必保留数据备份,因为一旦卸载,便

在 MongoDB 中存储日期和时间

发布时间:2023/05/11 浏览次数:762 分类:MongoDB

本 MongoDB 教程解释了 Date() 对象是什么以及如何使用 Date() 方法对集合进行排序。 这也将帮助您找到在 MongoDB 中显示和存储日期/时间的最佳方法。

MongoDB 按 ID 查找

发布时间:2023/05/11 浏览次数:1856 分类:MongoDB

MongoDB 中的 find by Id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 ID 匹配的文档,则返回空值。

检查 MongoDB 服务器是否正在运行

发布时间:2023/05/11 浏览次数:247 分类:MongoDB

这篇 MongoDB 教程将告诉您如何检查是否安装了 MongoDB 以及安装的 MongoDB 服务器的版本。 它在 Windows、UBUNTU 和 MAC 等不同的操作系统中实现。

MongoDB 中的分页

发布时间:2023/05/11 浏览次数:174 分类:MongoDB

这篇文章将介绍什么是 MongoDB 中的分页。 为什么在 MongoDB 中需要分页以及在 MongoDB 中完成分页的不同方法或方式是什么。

MongoDB 从查询开始

发布时间:2023/05/11 浏览次数:186 分类:MongoDB

在这篇 MongoDB 文章中,用户将学习如何使用 $regex 进行开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便