mongodb

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb相关的知识,希望对你有一定的参考价值。

mongodb

面向文档的数据库,不是关系型数据库
横向扩展:通过分区将数据数据分散到更多的机器上
(纵向扩展:使用计算能力更强的机器)

优势

MongoDB 相比 RDBMS 的优势
模式较少:MongoDB 是一种文档数据库,一个集合可以包含各种不同的文档。每个文档的字段数、内容以及文档大小都可以各不相同。
采用单个对象的模式,清晰简洁。
没有复杂的连接功能。
深度查询功能。MongoDB 支持对文档执行动态查询,使用的是一种不逊色于 SQL 语言的基于文档的查询语言。
具有调优功能。
易于扩展。MongoDB 非常易于扩展。
不需要从应用对象到数据库对象的转换/映射。
使用内部存储存储(窗口化)工作集,能够更快地访问数据。
为何选择使用 MongoDB
面向文档的存储:以 JSON 格式的文档保存数据。
任何属性都可以建立索引。
复制以及高可扩展性。
自动分片。
丰富的查询功能。
快速的即时更新。
来自 MongoDB 的专业支持。
MongoDB 适用的领域
大数据
内容管理及交付
移动及社会化基础设施
用户数据管理
数据中心

基本知识

文档是db 中数据的基本单元
集合看做一个拥有动态模式的表
mongodb 一个实例可以拥有多个互相独立的数据库,每一个数据库拥有自己的集合
每个文档都有一个特殊的键"_id" 这个键在文档所属的集合中是唯一的
自带js shell 管理数据库

文档

文档是键值对的一个有序集合

文档的键是字符串:

键不能含有 \\0(空字符),这个字符表示键的结尾

. 和$具有特殊意义

mongodb 区分类型和大小写, 不能有重复的键(key)

文档中的键/值是有序的,

集合

就是一组文档,集合相当于一张表
集合是动态的,集合里的文档可以是各式各样的,集合可以放任何文档

集合的命名

命令行使用:
https://docs.mongodb.com/manual/tutorial/getting-started/

数据类型

空值
数值
布尔型
字符串
日期
正则表达式
数组
内嵌文档
对象id
二进制数据
代码

$set 修改器
$unset
$inc 增加已有键的值

安装

rpm安装

安装服务端:
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/testing/x86_64/RPMS/mongodb-org-server-4.4.0-0.1.rc11.el7.x86_64.rpm
安装客户端命令:
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-shell-4.2.8-1.el7.x86_64.rpm

https://www.mongodb.com/download-center/community

安装手册
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu-tarball/

sudo apt-get install libcurl3 openssl
sudo cp <mongodb-install-directory>/bin/* /usr/local/bin/
sudo mkdir -p /var/lib/mongo
sudo mkdir -p /var/log/mongodb

sudo chown `whoami` /var/lib/mongo     # Or substitute another user
sudo chown `whoami` /var/log/mongodb   # Or substitute another user


mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


mongo

######RHEL  centos 
##https://www.mongodb.com/download-center/community?jmp=docs
sudo yum install libcurl openssl
tar -zxvf mongodb-linux-*-4.2.3.tgz
##Ensure the binaries are in a directory listed in your PATH environment variable.
sudo cp /path/to/the/mongodb-directory/bin/* /usr/local/bin/  #或者执行
##sudo ln -s  /path/to/the/mongodb-directory/bin/* /usr/local/bin/

##运行
##By default, MongoDB runs using the mongod user account and uses the following default directories:

/var/lib/mongo (the data directory)
/var/log/mongodb (the log directory)
#If you installed by downloading the tarballs 安装方式需要执行
sudo mkdir -p /var/lib/mongo
sudo mkdir -p /var/log/mongodb

##By default, MongoDB runs using the mongod user account. Once created, set the owner and group of these directories to mongod:
sudo chown -R mongod:mongod <directory>

#################使用非默认目录##########################################
#To Use Non-Default Directories
#To use a data directory and/or log directory other than the default directories:

#Create the new directory or directories.

#Edit the the configuration file /etc/mongod.conf and modify the following fields accordingly:

        storage.dbPath to specify a new data directory path (e.g. /some/data/directory)
        systemLog.path to specify a new log file path (e.g. /some/log/directory/mongod.log)
#Ensure that the user running MongoDB has access to the directory or directories:
sudo chown -R mongod:mongod <directory>
#If you change the user that runs the MongoDB process, you must give the new user access to these directories.

#Configure SELinux if enforced. See Configure SELinux.



####################Follow these steps to run MongoDB Community Edition on your system. These instructions assume that you are using the default settings.
sudo mkdir -p /var/lib/mongo
sudo mkdir -p /var/log/mongodb
sudo chown `whoami` /var/lib/mongo     # Or substitute another user
sudo chown `whoami` /var/log/mongodb   # Or substitute another user
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

#Verify that MongoDB has started successfully
#Verify that MongoDB has started successfully by checking the process output for the following line in the log file /var/log/mongodb/mongod.log:
[initandlisten] waiting for connections on port 27017

##使用mongodb
mongo

#####################################################
Localhost Binding by Defaul
By default, MongoDB launches with bindIp set to 127.0.0.1, which binds to the localhost network interface. This means that the mongod can only accept connections from clients that are running on the same machine. Remote clients will not be able to connect to the mongod, and the mongod will not be able to initialize a replica set unless this value is set to a valid network interface:

This value can be configured either:

1,in the MongoDB configuration file with bindIp, or
2,via the command-line argument --bind_ip

##############运行,以root用户#################
创建数据目录和日志目录后(默认数据库使用这些目录)
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log  --bind_ip 10.20.200.4   --fork  绑定到该ip 

mongo  --host 10.20.200.4  #进入


#####################################################

tar安装

curl  -LO  https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz
#安装示例目录
/root/mongodb/
ln  -sv    `pwd`/mongodb-linux-x86_64-rhel70-4.2.8   `pwd`/mongodb
cd  mongodb
mkdir logs
mkdir -p data/db

##创建配置文件
$ cd  /root/mongodb/bin
vim  mongodb.conf
#数据文件存放目录
dbpath = /root/mongodb/data/db
#日志文件存放目录
logpath = /root/mongodb/logs/mongodb.log
#端口
port = 27017
#以守护进程的方式启用,即后台运行;默认false
fork = true
# 关闭web管理访问,默认关闭27018端口访问,这个是在prot端口上加1000
#httpinterface = true
#是否开启权限验证
auth = true
#绑定ip,让其能够通过外网访问, 0.0.0.0代表所有
bind_ip = 0.0.0.0




#最开始先关闭  auth   fork 设置false  待创建用户后再打开



###创建启动脚本
cat   start.sh
./mongod -f mongodb.conf

## 关闭脚本
cat  stop.sh 
./mongod -f ./mongodb.conf --shutdown






##创建用户,确保配置文件关闭了auth   fork 设置false
#创建超级管理员可以添加、更新、删除用户,以及数据库授权

./mongo

use admin
db.createUser(
    {
        user:"userAdmin",
        pwd:"123456",
        roles:[{
            role:"userAdminAnyDatabase",
            db:"admin"
            }
        ]
    }
);


exit()


##修改配置文件,将auth的设置为true,开启权限验证。 重新启动。再次登陆



##认证的连接方式
1, mongo -port 27017 -u "admin"  -p "123456"

2,进入mongodb
./mongo
> use admin
switched to db admin
> db.auth("admin", "123456")
1
> show users;



#进入admin数据库
use admin
#进行权限认证
db.auth(\'userAdmin\', \'123456\')
#查询所有用户
db.system.users.find()
#更新用户
db.updateUser(\'demo\',{user:\'demo\',pwd:\'123456\',roles:[{role:\'read\',db:\'demo\'}]})
#删除用户
db.dropUser(\'demo\')
#创建数据库
use 数据库名
#显示已有数据库
show dbs




##一些链接
https://www.jianshu.com/p/62736bff7e2e
https://www.jianshu.com/p/f905a9a7fa1f


在线使用mongodb

https://docs.mongodb.com/manual/tutorial/getting-started/

#切换db
db  #查看当前db
show dbs #展示所有db
use <dbname>
db.dropDatabase()   在某数据库下删库
show tables  在数据库下显示数据集
db.test.find().pretty()  #搜索所有数据显示




#插入数据
db.inventory.insertMany([
   { item: "journal", qty: 25, status: "A", size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "notebook", qty: 50, status: "A", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
   { item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
   { item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]);

// MongoDB adds an _id field with an ObjectId value if the field is not present in the document
//The operation returns a document that contains the acknowledgement indicator and an array that contains the _id of each successfully inserted documents.


#查询all
db.inventory.find({})
db.inventory.find({}).pretty()  #格式化输出

##根据指定项查询
db.inventory.find( { status: "D" } );
db.inventory.find( { status: "D" } ).pretty();
db.inventory.find( { qty: 0 } );
db.inventory.find( { qty: 0, status: "D" } );
db.inventory.find( { "size.uom": "in" } )
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
db.inventory.find( { tags: "red" } )
db.inventory.find( { tags: [ "red", "blank" ] } )



##只显示指定域,所有的数据都会被查询出来
<field>: 1 to include a field in the returned documents   表示在返回的数据中包含此域
<field>: 0 to exclude a field in the returned documents   返回的数据中不包含此域

db.inventory.find( { }, { item: 1, status: 1 } );


db.inventory.find( {}, { _id: 0, item: 1, status: 1 } );

结合python使用

安装:
参考:https://www.runoob.com/python3/python-mongodb.html
https://docs.mongodb.com/ecosystem/drivers/pymongo/
https://api.mongodb.com/python/current/tutorial.html
https://www.w3cschool.cn/mongodb/mongodb-intro.html
https://api.mongodb.com/python/current/tutorial.html pymongo api 文档

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log  --bind_ip 10.20.200.4   --fork
python3 -m pip  install pymongo

安装参考:
https://pymongo.readthedocs.io/en/stable/installation.html
使用:


##创建数据库
#在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxxx"]  ##并不会真正的创建数据库

##判断数据库是否存在
import pymongo
myclient = pymongo.MongoClient(\'mongodb://10.20.200.4:27017/\')#
type(myclient)
dblist = myclient.list_database_names()  #database_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_database_names()。
print(dblist)
if "local" in dblist:
  print("数据库已存在!")



##创建集合
#注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["test"]     #字典模式获取数据库
# db = client.test_database  属性方式获取数据库
mycol = mydb["collections"]   ##获取数据库内的集合(类似表)
#collection = db.test_collection



##判断集合是否存在
#注意:collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()。
#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient(\'mongodb://localhost:27017/\')
 
mydb = myclient[\'tttt\']
 
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if "sites" in collist:   # 判断 sites 集合是否存在
  print("集合已存在!")

插入集合数据

集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name => value 对

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }
 
x = mycol.insert_one(mydict) 
print(x)
print(x)
##返回 _id 字段


#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient(\'mongodb://localhost:27017/\')
mydb = myclient[\'xxx\']
mycol = mydb["sites"]
 
mydict = { "name": "Google", "alexa": "1", "url": "https://www.google.com" }
 
x = mycol.insert_one(mydict)
 
print(x.inserted_id)

#如果我们在插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id


##其他案例
>>> import datetime
>>> post = {"author": "Mike",
...         "text": "My first blog post!",
...         "tags": ["mongodb", "python", "pymongo"],
...         "date": datetime.datetime.utcnow()}

>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId(\'...\')


>>> db.list_collection_names()
[u\'posts\']

插入多个文档:

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
mylist = [
  { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
  { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
  { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
  { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
  { "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]
 
x = mycol.insert_many(mylist)
 
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)

#insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值
#在命令端查看是否插入成功
use  dbname
db.collections.find().pretty()

插入指定 _id 的多个文档:

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["site2"]
 
mylist = [
  { "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"},
  { "_id": 2, "name": "Google", "address": "Google 搜索"},
  { "_id": 3, "name": "Facebook", "address": "脸书"},
  { "_id": 4, "name": "Taobao", "address": "淘宝"},
  { "_id": 5, "name": "Zhihu", "address": "知乎"}
]
 
x = mycol.insert_many(mylist) # pymongo.results.InsertManyResult
 
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)

查询集合

#查询一条数据
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
x = mycol.find_one()
print(x)


#查询集合中所有数据
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
for x in mycol.find():
  print(x)

###############
#查询指定字段的数据(所有文档)
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):  #除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然
  print(x)

##除了 alexa 字段外,其他都返回
for x in mycol.find({},{ "alexa": 0 }):
  print(x)


#################
##根据指定条件查询(所有文档的中键值相同的文档)
posts.find_one({"author": "Mike"})


#查找 name 字段为 "RUNOOB" 的数据:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xx"]
mycol = mydb["sites"]
myquery = { "name": "xxxx" }
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)

##高级查询
读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :
mydb = myclient["xxx"]
mycol = mydb["sites"]
myquery = { "name": { "$gt": "H" } }
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)

##使用正则表达式查询
正则表达式修饰符只用于搜索字符串的字段
用于读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^R"}
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xx"]
mycol = mydb["sites"]
myquery = { "name": { "$regex": "^R" } }
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)


##返回指定条数记录
myresult = mycol.find().limit(3)
# 输出结果
for x in myresult:
  print(x)

时间范围查询

>>> d = datetime.datetime(2009, 11, 12, 12)
>>> for post in posts.find({"date": {"$lt": d}}).sort("author"):
...   pprint.pprint(post)

Counting

查询集合中总文档的数量

#posts 为集合
posts.count_documents({})

#符合特定选项的文档数量
posts.count_documents({"author": "Mike"})

修改数据

使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段

##修改单个数据
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
myquery = { "alexa": "10000" }
newvalues = { "$set": { "alexa": "12345" } }
 
mycol.update_one(myquery, newvalues)
 
# 输出修改后的  "sites"  集合
for x in mycol.find():
  print(x)


##修改多个数据
#查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxxx"]
mycol = mydb["sites"]

myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } }
 
x = mycol.update_many(myquery, newvalues)
 
print(x.modified_count, "文档已修改")

数据排序

sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
mydoc = mycol.find().sort("alexa")
for x in mydoc:
  print(x)

##降序排序
mydoc = mycol.find().sort("alexa", -1)
 
for x in mydoc:
  print(x)

删除数据

delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据
delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
myquery = { "name": "Taobao" }
 
mycol.delete_one(myquery)
 
# 删除后输出
for x in mycol.find():
  print(x)


##删除多个数据:删除所有 name 字段中以 F 开头的文档
myquery = { "name": {"$regex": "^F"} }
 
x = mycol.delete_many(myquery)
 
print(x.deleted_count, "个文档已删除")


##删除集合中的所有文档
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxxx"]
mycol = mydb["sites"]
 
x = mycol.delete_many({})
 
print(x.deleted_count, "个文档已删除")

##删除集合
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["xxx"]
mycol = mydb["sites"]
 
mycol.drop()
如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false
#命令在终端查看集合是否已删除
use dbname 
show tables ;

其他:


插入数据
insert_one    根据返回的数量判断数据是否操作成
insert_many

修改数据
#update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。
myquery = { "alexa": "10000" }
newvalues = { "$set": { "alexa": "12345" } 
mycol.update_one(myquery, newvalues)
# 输出修改后的  "sites"  集合
for x in mycol.find():
  print(x)



修改多条数据: 所有符合规则的数据都会被修改
myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")



##数据排序
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序   根据薪水
mydoc = mycol.find().sort("alexa")
#mydoc = mycol.find().sort("alexa", -1)
for x in mydoc:
  print(x)



##删除数据
yquery = { "name": "Taobao" }
mycol.delete_one(myquery)  #根据条件删除
# 删除后输出
for x in mycol.find():
  print(x)


###删除多个数据
myquery = { "name": {"$regex": "^F"} }
 
x = mycol.delete_many(myquery)
 
print(x.deleted_count, "个文档已删除")


x = mycol.delete_many({}) 
print(x.deleted_count, "个文档已删除")  ##集合中的所有数据被删除


mycol = mydb["sites"]  
mycol.drop()  ##删除整个集合
 

小例子:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2/18/20 5:11 PM
# @Author  : yon
# @Email   : xxxxx@qq.com
# @File    : mongodb.py

import json
import pymongo

# mongo  --host    192.168.2.123


class HandleMongodb(object):
    def __init__(self, ip, name, col):
        self.dbaddress = \'mongodb://{}:27017/\'.format(ip)
        self.dbname = name
        self.dbcol = col
        self.doc = self.db_isexists()

    def db_isexists(self):
        try:
            myclient = pymongo.MongoClient(self.dbaddress)
            mydb = myclient[self.dbname]
            return mydb[self.dbcol]
        except Exception as e:
            raise Exception("ERROR :init db!")

    def insert_one(self, dic):
        result = self.doc.insert_one(dic)
        if result.inserted_id:
            return True
        else:
            return False

    def insert_many(self, dics):
        pass

    def modify(self, query, tochange):
        # moodify one item
        newvalue = {"$set": tochange}
        modifyresult = self.doc.update_one(query, newvalue)
        if modifyresult.modified_count:
            return True
        else:
            return False

mongodb可视化工具

https://robomongo.org/download

下载Robo 3T

以上是关于mongodb的主要内容,如果未能解决你的问题,请参考以下文章

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS