MongoDB-更新文档

时间:2020-02-23 14:40:52  来源:igfitidea点击:

在本MongoDB教程中,我们将学习更新文档。

登录到您的MongoDB服务器并插入以下文档。

对于本教程,我将把文档插入订阅集合中。

> db.subscription.insertMany([
  {
    "firstname": "John",
    "lastname": "Doe",
    "uid": 1,
    "accountstatus": "ACTIVE",
    "plan": "TRIAL15DAYS",
    "modifiedAt": null,
    "createdAt": new Date()
  },
  {
    "firstname": "Jane",
    "lastname": "Doe",
    "uid": 2,
    "accountstatus": "ACTIVE",
    "plan": "PLAN30DAYS",
    "modifiedAt": null,
    "createdAt": new Date()
  },
  {
    "firstname": "Jim",
    "lastname": "Doe",
    "uid": 3,
    "accountstatus": "SUSPENDED",
    "plan": "PLAN60DAYS",
    "modifiedAt": null,
    "createdAt": new Date()
  },
  {
    "firstname": "Alice",
    "lastname": "Doe",
    "uid": 4,
    "accountstatus": "ACTIVE",
    "plan": "PLAN1YEAR",
    "modifiedAt": null,
    "createdAt": new Date()
  }
])

注意!我们使用new Date()将createdAt设置为当前日期时间。

更新一份文件

要更新单个文档,我们使用updateOne方法。

语法

db.collectionName.updateOne(filter, update)

其中,filter是获取所需文档的条件,而更新是我们要更新的文档的一部分。

在以下示例中,我们将" uid"等于" 3"的用户的帐户状态从"已暂停"更新为"活动"。

> db.subscription.updateOne(
  { "uid": 3 },
  {
    $set: { "accountstatus": "ACTIVE" },
    $currentDate: { "modifiedAt": true }
  }
)

我们使用$set操作符来更新accountstatus的值。

我们使用$currentDate运算符将ModifyedAt设置为当前日期。

如果现在获取上述文档,我们将获得以下内容。

> db.subscription.find({ "uid": 3 }).pretty()

{
  "_id" : ObjectId("5d7715d5b385796f53d4c8ff"),
  "firstname" : "Jim",
  "lastname" : "Doe",
  "uid" : 3,
  "accountstatus" : "ACTIVE",
  "plan" : "PLAN60DAYS",
  "modifiedAt" : ISODate("2019-09-10T03:18:42.406Z"),
  "createdAt" : ISODate("2019-09-10T03:17:41.130Z")
}

如果不存在,则使用updateOne方法插入新文档

我们可以使用updateOne方法来更新现有文档,如果不存在,还可以插入新文档。

语法

db.collectionName.updateOne(filter, update, option)

在选项中,将" upsert"设置为" true"。
如果不存在,这将有助于插入新文档。

在下面的示例中,我们使用updateOne方法在subscription集合中插入一个新文档。

> db.subscription.updateOne(
  { "uid": 5 },
  {
    $set: {
      "firstname": "Bob",
      "lastname": "Doe",
      "uid": 5,
      "accountstatus": "ACTIVE",
      "plan": "PLAN1YEAR",
      "modifiedAt": null,
      "createdAt": new Date()
    }
  },
  {
    upsert: true
  }
)

如果现在获取新插入的文档,我们将得到以下结果。

> db.subscription.find({ "uid": 5 }).pretty()

{
  "_id" : ObjectId("5d771bc30a7168b744863bc6"),
  "uid" : 5,
  "accountstatus" : "ACTIVE",
  "createdAt" : ISODate("2019-09-10T03:42:59.876Z"),
  "firstname" : "Bob",
  "lastname" : "Doe",
  "modifiedAt" : null,
  "plan" : "PLAN1YEAR"
}

更新多个文件

要更新多个文档,我们使用updateMany方法。

在以下示例中,我们将针对uid 2、3和4的计划更新为PLAN60DAYS。

> db.subscription.updateMany(
  { "uid": { $in: [2, 3, 4] } },
  {
    $set: { "plan": "PLAN60DAYS" },
    $currentDate: { "modifiedAt": true }
  }
)

在MongoDB-查询文档教程中学习使用$in和其他运算符过滤文档。

替换一份文件

我们使用replaceOne方法来替换文档中除'_id'之外的全部内容。

在下面的示例中,我们将替换uid等于5的文档的内容。

> db.subscription.replaceOne(
  { "uid": 5 },
  {
    "firstname": "Bob",
    "lastname": "Doe",
    "uid": 5,
    "accountstatus": "ACTIVE",
    "plan": "PLAN90DAYS",
    "modifiedAt": new Date(),
    "createdAt": new Date()
  }
)

如果将新文档不存在,我们也可以使用replaceOne方法来插入新文档,方法是将upsert选项设置为true。

> db.subscription.replaceOne(
  { "uid": 6 },
  {
    "firstname": "Billy",
    "lastname": "Doe",
    "uid": 6,
    "accountstatus": "ACTIVE",
    "plan": "PLAN90DAYS",
    "modifiedAt": new Date(),
    "createdAt": new Date()
  },
  {
    upsert: true
  }
)