MongoDB $setOnInsert 运算符介绍

Mongodb $setOnInsert 运算符用于在执行 update 操作时,当文档不存在时才会对其进行更新。该运算符用于指定在插入新文档时要设置的字段的值。如果执行的 update 操作是更新现有文档,则 $setOnInsert 运算符不会起作用。

语法

$setOnInsert 运算符的语法如下:

{ $setOnInsert: { <field1>: <value1>, ... } }

其中,<field1> 表示要设置的字段名,<value1> 表示要设置的值。

使用场景

当我们需要在执行 update 操作时,在文档不存在时插入一些默认的字段值时,可以使用 $setOnInsert 运算符。例如,在创建新用户时,我们可能需要为新用户的文档添加一些默认值,例如创建时间、最后登录时间等。此时,可以使用 $setOnInsert 运算符来设置这些默认值。

示例

示例 1

假设我们有一个名为 users 的集合,其中存储了一些用户的信息。现在,我们需要向该集合中插入一条新的用户信息,其中包含 usernameemailcreated_atupdated_at 四个字段。在插入新文档时,我们需要设置 created_atupdated_at 两个字段的值为当前时间。此时,可以使用 $setOnInsert 运算符来设置这些默认值。具体实现代码如下:

db.users.update(
  { username: "JohnDoe" },
  {
    $setOnInsert: {
      email: "[email protected]",
      created_at: new Date(),
      updated_at: new Date()
    }
  },
  { upsert: true }
)

执行上述代码后,如果 users 集合中不存在用户名为 JohnDoe 的用户,则会插入一条新的用户信息,其中包含 emailcreated_atupdated_at 四个字段,并将 created_atupdated_at 两个字段的值设置为当前时间。如果 users 集合中已经存在用户名为 JohnDoe 的用户,则不会进行任何操作。

示例 2

假设我们有一个名为 articles 的集合,其中存储了一些文章的信息,它包含以下字段:

{
  "_id": ObjectId("6140b7a123c40bfc5e5ecb02"),
  "title": "Introduction to MongoDB",
  "content": "MongoDB is a document database",
  "created_at": ISODate("2022-09-14T10:23:41.729Z"),
  "updated_at": ISODate("2022-09-14T10:23:41.729Z")
}

现在,我们需要向该集合中插入一篇新的文章,其中包含 titlecontentpublished_atupdated_at 四个字段。在插入新文档时,我们需要设置 published_at 字段的值为当前时间。此时,可以使用 $setOnInsert 运算符来设置这些默认值。

我们可以使用以下命令向 articles 集合插入一篇新的文章:

db.articles.updateOne(
  { title: "Introduction to MongoDB" },
  {
    $setOnInsert: {
      content: "This is a new MongoDB article",
      published_at: new Date(),
      updated_at: new Date()
    }
  },
  { upsert: true }
)

以上命令会在 articles 集合中查找 title 为 “Introduction to MongoDB” 的文档,如果找到了该文档,则仅更新其 updated_at 字段;如果没有找到该文档,则创建一个新文档,并设置默认值,其中 published_atupdated_at 字段的值都为当前时间。

执行以上命令后,articles 集合中的文档会变成以下样子:

{
  "_id": ObjectId("6140b7a123c40bfc5e5ecb02"),
  "title": "Introduction to MongoDB",
  "content": "MongoDB is a document database",
  "created_at": ISODate("2022-09-14T10:23:41.729Z"),
  "updated_at": ISODate("2022-09-14T10:23:41.729Z")
},
{
  "_id": ObjectId("622634bfb59b6c2318656ed7"),
  "title": "Introduction to MongoDB",
  "content": "This is a new MongoDB article",
  "published_at": ISODate("2023-03-09T02:54:11.526Z"),
  "updated_at": ISODate("2023-03-09T02:54:11.526Z")
}

可以看到,插入了一篇新的文章,其中 published_atupdated_at 字段的值都为当前时间。

结论

$setOnInsert 运算符是 MongoDB 中一种非常有用的操作符,它可以在文档插入时设置字段的默认值,从而减少代码的编写量,提高开发效率。我们可以清晰地了解到该运算符的用法以及适用情况。在实际的开发中,我们可以根据具体情况,灵活地使用该运算符来满足项目需求。