迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > 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 中的字段

发布时间:2023/04/21 浏览次数:51 分类:MongoDB

在本文中,我们将了解如何比较 MongoDB 中的两个字段。 此外,我们将看到一个相关的示例和解释,以使主题更容易理解。

清除或删除 MongoDB 中的集合

发布时间:2023/04/21 浏览次数:147 分类:MongoDB

本篇文章将告诉大家如何删除 MongoDB 数据库中的集合以及删除 MongoDB 中的集合的不同方法。

MongoDB 截断集合

发布时间:2023/04/21 浏览次数:178 分类:MongoDB

可以根据需要选择两个选项之一来截断下面的集合。 在今天的文章中,我们将学习如何在 MongoDB 中截断集合。

删除 MongoDB 中的重复项

发布时间:2023/04/21 浏览次数:151 分类:MongoDB

在本文中,我们将了解如何删除 MongoDB 中的重复条目,并且我们还将看到一个带有适当解释的示例,以使主题更容易理解。

使用 NodeJS 检查 MongoDB 中是否存在集合

发布时间:2023/04/21 浏览次数:194 分类:MongoDB

在本文中,我们将检查 MongoDB 数据库中是否存在一个集合,并且我们还将查看与主题相关的示例,以使主题更容易理解。 为此,我们将使用 Node.js。

MongoDB 中的唯一索引

发布时间:2023/04/21 浏览次数:144 分类:MongoDB

在这篇教学文章中,您将了解唯一索引、它们是什么以及如何在 MongoDB 中使索引唯一。 此外,还简要详细地解释了使用户的电子邮件在 MongoDB 中唯一。

在 MongoDB 中创建索引

发布时间:2023/04/21 浏览次数:104 分类:MongoDB

索引有助于有效解决查询。 如果没有索引,MongoDB 必须遍历集合中的每个文档才能找到与查询匹配的文档。因此,在今天的文章中,我们将学习如何在 MongoDB 中创建索引。

MongoDB 中的稀疏索引

发布时间:2023/04/21 浏览次数:142 分类:MongoDB

在本文中,我们将讨论 MongoDB 中的稀疏索引。 此外,我们将提供一个相关示例并进行解释,以使该主题更容易理解。

MongoDB 中的复合索引

发布时间:2023/04/21 浏览次数:119 分类:MongoDB

在本文中,我们将讨论复合索引,并且我们还将看到一个带有解释的示例,以使主题更容易理解。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便