2.MongoDB 初级Shell语法操作

0. 进入Shell操作界面

# 进入第一篇我们部署的mongoDB单机版目录
cd /opt/mongodb/bin
./mongo localhost:27017

1. 数据库操作

1.1 查看数据库

show dbs;

1.2 创建数据库

use xswl;

请注意, 执行完这句话之后, 再执行 show dbs;
你会发现xswl其实并没有在列表里, 这是因为在 MongoDB 中, 集合只有在内容插入后才会创建! 就是说, 创建集合(数据表)后要再插入一个文档(记录), 集合才会真正创建.
所以你需要执行插入操作, 这时 --> show dbs; 就看得到了.

1.3 删除数据库

db.dropDatabase();

2. 集合操作

2.1 增加集合

集合相当于数据库表, 但是mongodb可以不使用语句创建, 可以直接'指定集合插入, 表自动创建.

# 无参数
db.createCollection("you collection Name");
# 有参数
db.createCollection("colName", options);

options具体可看: https://www.runoob.com/mongodb/mongodb-create-collection.html

2.2 删除集合

db.${collectionName}.drop();

2.3 查看集合

show tables;
# 或者
show collections;

3. 数据操作

3.1 插入数据

db.COLLECTION_NAME.insert(document);

db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

3.2 更新数据

# 基本语法: db.collection.update({query}, {$set:{key:value}});
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

详细请看:https://www.runoob.com/mongodb/mongodb-update.html

3.3 删除数据

db.col.remove({query});

# 删除全部数据
dn.col.remove({});

3.4 查询数据

db.col.find({and}, {projection});

https://www.runoob.com/mongodb/mongodb-query.html

3.5 条件操作符

  • $gt --> greater than --> >
  • $gte --> gt equal --> >=
  • $lt -->less than --> <
  • $lte --> lt equal --> <=
  • $ne --> not equal --> !=
  • $eq --> equal --> =
# select * from col where likes > 100;
db.col.find({likes : {$gt : 100}})

3.6 limit & skip

# 通常用来做分页, 只会显示第二条. 跳过一条, 显示一条. 先skip再limit, 和顺序没有关系
db.col.find({},{"title":1,_id:0}).limit(1).skip(1)

补充说明skip和limit方法只适合小数据量分页, 如果是百万级效率就会非常低, 因为skip方法是一条条数据数过去的, 建议使用where_limit

在查看了一些资料之后, 发现所有的资料都是这样说的:

不要轻易使用skip来做查询, 否则数据量大了就会导致性能急剧下降, 这是因为skip是一条一条的数过来的, 多了自然就慢了.

这么说skip就要避免使用了, 那么如何避免呢? 首先来回顾SQL分页的后一种时间戳分页方案, 这种利用字段的有序性质, 利用查询来取数据的方式, 可以直接避免掉了大量的数数. 也就是说, 如果能附带上这样的条件那查询效率就会提高, 事实上是这样的么? 我们来验证一下:

这里我们假设查询第100001条数据, 这条数据的Amount值是:2399927, 我们来写两条语句分别如下:

b.test.sort({"amount":1}).skip(100000).limit(10) //183ms
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
结果已经附带到注释了, 很明显后者的性能是前者的三分之一, 差距是非常大的. 也印证了skip效率差的理论.

3.7 sort

# 1 为正序, -1 为倒序
db.COLLECTION_NAME.find().sort({KEY:1})

skip(), limilt(), sort()三个放在一起执行的时候, 执行的顺序是先 sort(), 然后是 skip(), 最后是显示的 limit().

4. bulkWrite

批量插入可以使用insertMany(), 但是如果是批量操作呢? 例如我想在一次请求中包含插入, 修改, 删除操作. 这个时候就得用上bulkWrite().
db.collection.bulkWrite() 方法提供了执行批量插入、更新和删除操作的能力.

 # 格式
 db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
   {
      writeConcern : <document>,
      ordered : <boolean>
   }
)

参数 类型 描述
operations array bulkWrite() 写操作的数组. 支持操作:insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne
writeConcern document 可选, write concern 文档, 省略则使用默认的 write concern.
ordered boolean 可选, 表示mongod实例有序还是无序执行操作。默认值true.
方法返回值:
  • 操作基于 write concern 运行则 acknowledged 值为true,如果禁用 write concern 运行则 acknowledged 值为false。
  • 每一个写操作数。
  • 成功 inserted 或 upserted文档的 _id 的组数。
# 实例
try {
   db.characters.bulkWrite(
      [
         { insertOne :
            {
               "document" :
               {
                  "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
               }
            }
         },
         { insertOne :
            {
               "document" :
               {
                  "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3
               }
            }
         },
         { updateOne :
            {
               "filter" : { "char" : "Eldon" },
               "update" : { $set : { "status" : "Critical Injury" } }
            }
         },
         { deleteOne :
            { "filter" : { "char" : "Brisbane"} }
         },
         { replaceOne :
            {
               "filter" : { "char" : "Meldane" },
               "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 }
            }
         }
      ]
   );
}
catch (e) {
   print(e);
}

https://xuexiyuan.cn/article/detail/173.html

posted @ 2019-07-29 16:44  夢見貓、  阅读(413)  评论(0编辑  收藏  举报