MongoDB文档基本操作

MongoDB插入文档

文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。

BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON。

插入文档语法

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:

db.COLLECTION_NAME.insert(document)

插入文档实例

以下文档可以存储在 MongoDB 的 appblog 数据库 的 site 集合中:

> db.site.insert({title: 'MongoDB文档基本操作', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'APP开发技术博客',
    url: 'http://www.appblog.cn',
    tags: ['MongoDB', 'database', 'NoSQL'],
    likes: 100
})

以上实例中 site 是我们的集合名,如果该集合不在该数据库中,MongoDB 会自动创建该集合并插入文档。

查看已插入文档:

> db.site.find()
{ "_id" : ObjectId("5aebc8fd851561202b93df06"), "title" : "MongoDB文档基本操作", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "APP开发技术博客", "url" : "http://www.appblog.cn", "tags" : [ "MongoDB", "database", "NoSQL" ], "likes" : 100 }
> 

我们也可以将数据定义为一个变量,如下所示:

> document = ({title: 'MongoDB文档基本操作', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'APP开发技术博客',
    url: 'http://www.appblog.cn',
    tags: ['MongoDB', 'database', 'NoSQL'],
    likes: 100
});

执行后显示结果如下:

{
    "title" : "MongoDB文档基本操作",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "APP开发技术博客",
    "url" : "http://www.appblog.cn",
    "tags" : [
        "MongoDB",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}

执行插入操作:

> db.site.insert(document)
WriteResult({ "nInserted" : 1 })

插入文档也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

MongoDB 3.2 版本后提供可用于插入文档的语法

db.collection.insertOne():向指定集合中插入一条文档数据
db.collection.insertMany():向指定集合中插入多条文档数据

  • 插入单条数据
> var document = db.collection.insertOne({"a": 3})
> document
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5aebcafb851561202b93df08")
}
  • 插入多条数据
> var res = db.collection.insertMany([{"b": 1}, {'c': 2}])
> res
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5aebcb6c851561202b93df09"),
        ObjectId("5aebcb6c851561202b93df0a")
    ]
}

MongoDB更新文档

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。

update() 方法

语法

update() 方法用于更新已存在的文档。语法格式如下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

  • query:update的查询条件,类似sql update查询内where后面的。
  • update:update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。
  • upsert:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew。true为插入,默认是false,不插入。
  • multi:可选,MongoDB 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern:可选,抛出异常的级别。
    • WriteConcern.NONE:没有异常抛出
    • WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
    • WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作
    • WriteConcern.MAJORITY:抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作
    • WriteConcern.FSYNC_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘
    • WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件
    • WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作

实例

我们在集合 col 中插入如下数据:

> db.col.insert({title: 'MongoDB文档基本操作', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'APP开发技术博客',
    url: 'http://www.appblog.cn',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

接着我们通过 update() 方法来更新标题(title):

> db.col.update({'title':'MongoDB文档基本操作'}, {$set:{'title':'MongoDB文档更新操作'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find().pretty()
{
    "_id" : ObjectId("5aebcfa8851561202b93df0c"),
    "title" : "MongoDB文档更新操作",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "APP开发技术博客",
    "url" : "http://www.appblog.cn",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}
> 

可以看到标题(title)由原来的 "MongoDB文档基本操作" 更新为 "MongoDB文档更新操作"。

以上语句只会修改第一条发现的文档,如果需要修改多条相同的文档,则需要设置 multi 参数为 true。

> db.col.update({'title':'MongoDB文档基本操作'}, {$set:{'title':'MongoDB文档更新操作'}}, {multi:true})

save() 方法

语法

save() 方法通过传入的文档来替换已有文档。语法格式如下:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

参数说明:

  • document:文档数据。
  • writeConcern:可选,抛出异常的级别。

实例

以下实例中我们替换了 _id 为 5aebcfa8851561202b93df0c 的文档数据:

> db.col.save({
    "_id" : ObjectId("5aebcfa8851561202b93df0c"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "APP开发技术博客",
    "url" : "http://www.appblog.cn",
    "tags" : [
        "MongoDB",
        "NoSQL"
    ],
    "likes" : 110
})

替换成功后,我们可以通过 find() 命令来查看替换后的数据

> db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "APP开发技术博客",
        "url" : "http://www.appblog.cn",
        "tags" : [
            "MongoDB",
            "NoSQL"
        ],
        "likes" : 110
}

更多实例

只更新第一条记录:

db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} } );

全部更新:

db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} }, false, true );

只添加第一条:

db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} }, true, false );

全部添加进去:

db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} }, true, true );

全部更新:

db.col.update( { "count" : { $gt : 8 } } , { $inc : { "count" : 1} }, false, true );

只更新第一条记录:

db.col.update( { "count" : { $gt : 8 } } , { $inc : { "count" : 1} }, false, false );

MongoDB 3.2版本开始,MongoDB提供更新集合文档的方法

  • db.collection.updateOne():向指定集合更新单个文档
  • db.collection.updateMany():向指定集合更新多个文档

首先我们在test集合里插入测试数据

use test
db.test_collection.insert([
  {"name":"china","age":"20","status":"a"},
  {"name":"america","age":"19","status":"b"},
  {"name":"russia","age":"18","status":"c"},
])

更新单个文档

> db.test_collection.updateOne({"name":"china"},{$set:{"age":"28"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "china", "age" : "28", "status" : "a" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "america", "age" : "19", "status" : "b" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "russia", "age" : "18", "status" : "c" }
>

更新多个文档

> db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "china", "age" : "28", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "america", "age" : "19", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "russia", "age" : "18", "status" : "xyz" }
>

MongoDB删除文档

remove() 方法

MongoDB remove()函数是用来移除集合中的数据。

MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

语法

remove() 方法的基本语法格式如下所示:

db.collection.remove(
   <query>,
   <justOne>
)

如果 MongoDB 是 2.6 版本以后的,语法格式如下:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

  • query:(可选)删除的文档的条件。
  • justOne:(可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern:(可选)抛出异常的级别。

实例

以下文档我们执行两次插入操作:

> db.col.insert({title: 'MongoDB文档基本操作', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'APP开发技术博客',
    url: 'http://www.appblog.cn',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

使用 find() 函数查询数据:

> db.col.find()
{ "_id" : ObjectId("5aebc8fd851561202b93df06"), "title" : "MongoDB文档基本操作", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "APP开发技术博客", "url" : "http://www.appblog.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5aebca2c851561202b93df07"), "title" : "MongoDB文档基本操作", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "APP开发技术博客", "url" : "http://www.appblog.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
> 

接下来我们移除 title 为 'MongoDB文档基本操作' 的文档:

> db.col.remove({'title':'MongoDB文档基本操作'})
WriteResult({ "nRemoved" : 2 })           # 删除了两条数据
> db.col.find()
……                                        # 没有数据

如果只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

> db.col.remove({'title':'MongoDB文档基本操作'}, {justOne:1})

如果想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

> db.col.remove({})

deleteOne() 和 deleteMany() 方法

remove() 方法已经过时,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。

如删除集合下全部文档:

db.inventory.deleteMany({})

删除 status 等于 A 的全部文档:

```javascript
db.inventory.deleteMany({ status : "A" })

删除 status 等于 D 的一个文档:

db.inventory.deleteOne( { status: "D" } )

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/12/mongodb-document-basic-operations/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
MongoDB文档基本操作
MongoDB插入文档 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。 BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON。 插……
<<上一篇
下一篇>>
文章目录
关闭
目 录