技术文章 MongoDB Collection 聚集集合操作

laofo · 2017年03月16日 · 最后由 laofo521@gmail.com 回复于 2017年03月16日 · 3 次阅读

查看聚集集合基本信息
1、 查看帮助 db.yourColl.help();

2、 查询当前集合的数据条数 db.yourColl.count();

3、 查看数据空间大小 db.userInfo.dataSize();

4、 得到当前聚集集合所在的 db db.userInfo.getDB();

5、 得到当前聚集的状态 db.userInfo.stats();

6、 得到聚集集合总大小 db.userInfo.totalSize();

7、 聚集集合储存空间大小 db.userInfo.storageSize();

8、 Shard 版本信息 db.userInfo.getShardVersion()

9、 聚集集合重命名 db.userInfo.renameCollection("users"); 将 userInfo 重命名为 users

10、 删除当前聚集集合 db.userInfo.drop();

聚集集合查询 1、 查询所有记录 db.userInfo.find(); 相当于:select * from userInfo; 默认每页显示 20 条记录,当显示不下的情况下,可以用 it 迭代命令查询下一页数据。注意:键入 it 命令不能带 “;” 但是你可以设置每页显示数据的大小,用 DBQuery.shellBatchSize = 50;这样每页就显示 50 条记录了。

2、 查询去掉后的当前聚集集合中的某列的重复数据 db.userInfo.distinct("name"); 会过滤掉 name 中的相同数据 相当于:select distict name from userInfo;

3、 查询 age = 22 的记录 db.userInfo.find({"age": 22}); 相当于: select * from userInfo where age = 22;

4、 查询 age > 22 的记录 db.userInfo.find({age: {$gt: 22}}); 相当于:select * from userInfo where age > 22;

5、 查询 age < 22 的记录 db.userInfo.find({age: {$lt: 22}}); 相当于:select * from userInfo where age < 22;

6、 查询 age >= 25 的记录 db.userInfo.find({age: {$gte: 25}}); 相当于:select * from userInfo where age >= 25;

7、 查询 age <= 25 的记录 db.userInfo.find({age: {$lte: 25}});

8、 查询 age >= 23 并且 age <= 26 db.userInfo.find({age: {$gte: 23, $lte: 26}});

9、 查询 name 中包含 mongo 的数据 db.userInfo.find({name: /mongo/}); //相当于%% select * from userInfo where name like ‘%mongo%’;

10、 查询 name 中以 mongo 开头的 db.userInfo.find({name: /^mongo/}); select * from userInfo where name like ‘mongo%’;

11、 查询指定列 name、age 数据 db.userInfo.find({}, {name: 1, age: 1}); 相当于:select name, age from userInfo; 当然 name 也可以用 true 或 false,当用 ture 的情况下河 name:1 效果一样,如果用 false 就是排除 name,显示 name 以外的列信息。

12、 查询指定列 name、age 数据, age > 25 db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1}); 相当于:select name, age from userInfo where age > 25;

13、 按照年龄排序 升序:db.userInfo.find().sort({age: 1}); 降序:db.userInfo.find().sort({age: -1});

14、 查询 name = zhangsan, age = 22 的数据 db.userInfo.find({name: 'zhangsan', age: 22}); 相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;

15、 查询前 5 条数据 db.userInfo.find().limit(5); 相当于:select top 5 * from userInfo;

16、 查询 10 条以后的数据 db.userInfo.find().skip(10); 相当于:select * from userInfo where id not in ( select top 10 * from userInfo );

17、 查询在 5-10 之间的数据 db.userInfo.find().limit(10).skip(5); 可用于分页,limit 是 pageSize,skip 是第几页 *pageSize

18、 or 与 查询 db.userInfo.find({$or: [{age: 22}, {age: 25}]}); 相当于:select * from userInfo where age = 22 or age = 25;

19、 查询第一条数据 db.userInfo.findOne(); 相当于:select top 1 * from userInfo; db.userInfo.find().limit(1);

20、 查询某个结果集的记录条数 db.userInfo.find({age: {$gte: 25}}).count(); 相当于:select count(*) from userInfo where age >= 20;

21、 按照某列进行排序 db.userInfo.find({sex: {$exists: true}}).count(); 相当于:select count(sex) from userInfo;

索引 1、 创建索引 db.userInfo.ensureIndex({name: 1}); db.userInfo.ensureIndex({name: 1, ts: -1});

2、 查询当前聚集集合所有索引 db.userInfo.getIndexes();

3、 查看总索引记录大小 db.userInfo.totalIndexSize();

4、 读取当前集合的所有 index 信息 db.users.reIndex();

5、 删除指定索引 db.users.dropIndex("name_1");

6、 删除所有索引索引 db.users.dropIndexes();

修改、添加、删除集合数据 1、 添加 db.users.save({name: ‘zhangsan’, age: 25, sex: true}); 添加的数据的数据列,没有固定,根据添加的数据为准

2、 修改 db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true); 相当于:update users set name = ‘changeName’ where age = 25;

db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true); 相当于:update users set age = age + 50 where name = ‘Lisi’;

db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true); 相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;

3、 删除 db.users.remove({age: 132});

4、 查询修改删除 db.users.findAndModify({ query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true });

db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true }); 参数 详解 默认值 query 查询过滤条件 {} sort 如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作 {} remove 若为 true,被选中对象将在返回前被删除 N/A update 一个 修改器对象 N/A new 若为 true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。 false fields 参见 Retrieving a Subset of Fields (1.5.0+) All fields upsert 创建新对象若查询结果为空。 示例 (1.5.4+) false

语句块操作 1、 简单 Hello World print("Hello World!"); 这种写法调用了 print 函数,和直接写入"Hello World!"的效果是一样的;

2、 将一个对象转换成 json tojson(new Object()); tojson(new Object('a'));

3、 循环添加数据

for (var i = 0; i < 30; i++) { ... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); ... }; 这样就循环添加了 30 条数据,同样也可以省略括号的写法 for (var i = 0; i < 30; i++) db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); 也是可以的,当你用 db.users.find() 查询的时候,显示多条数据而无法一页显示的情况下,可以用 it 查看下一页的信息;

4、 find 游标查询

var cursor = db.users.find(); while (cursor.hasNext()) { printjson(cursor.next()); } 这样就查询所有的 users 信息,同样可以这样写 var cursor = db.users.find(); while (cursor.hasNext()) { printjson(cursor.next); } 同样可以省略{}号

5、 forEach 迭代循环 db.users.find().forEach(printjson); forEach 中必须传递一个函数来处理每条迭代的数据信息

6、 将 find 游标当数组处理 var cursor = db.users.find(); cursor[4]; 取得下标索引为 4 的那条数据 既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者 cursor.count(); 那样我们也可以用循环显示数据 for (var i = 0, len = c.length(); i < len; i++) printjson(c[i]);

7、 将 find 游标转换成数组

var arr = db.users.find().toArray(); printjson(arr[2]); 用 toArray 方法将其转换为数组

8、 定制我们自己的查询结果 只显示 age <= 28 的并且只显示 age 这列数据 db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson); db.users.find({age: {$lte: 28}}, {age: true}).forEach(printjson); 排除 age 的列 db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson);

9、 forEach 传递函数显示信息 db.things.find({x:4}).forEach(function(x) {print(tojson(x));}); 上面介绍过 forEach 需要传递一个函数,函数会接受一个参数,就是当前循环的对象,然后在函数体重处理传入的参数信息。

有些东西真的是只有实际操作过、印象才深刻。

整了一早上的 mongo db,其实就几句话的事情。

mongo 192.168.1.1/container
show databases;
use container;
show collections;
db.user.find()
db.user.find({"name":'laofo'})
db.container.find({"owner":"laofo"})
db.container.find({"id":"79a7e6ee0355812c2c6b30efe117e271"})
db.container.update({"id":"79a7e6ee0355812c2c6b30efe117e271"},{$set:{"owner":'scmroad'}})
需要 登录 后方可回复。