zoukankan      html  css  js  c++  java
  • mongodb学习03 操作详解

    插入文档

    • db.test.insert({"name":"jinks"});

    批量插入

    • db.test.insert([{}, {}, {}]);
    • 一次批量插入过程中失败时,之前插入的信息插入保存,之后的信息不会再继续插入;

    限制

    • 每次插入都有一个最大限制(与驱动版本有关),超过限制驱动程序会将这次请求拆分;
    • 批量插入不能在单次请求中将 多个文档批量插入到多个集合中;要是只导入原始数据(例如,从数据feed或者MySQL中导入),可以使用命令行工具,如mongoimport`;
    • 所有文档 都必须小于 16 MB(未来有可能会增加);

    插入前检查:

    • 由于MongoDB只进行最基本的检查,所以插入非法数据很容易。因此,应该只允许信任的源连接数据库。

    删除文档

    • db.test.remove(限制条件);
    • 如果要清空整个集合,使用db.test.drop();

    更新文档

    • db.collection.update(query, update, options);

    更新时注意

    • 如果更新的文档数据包含_id,而选择的目标文件有多个,很可能导致整个跟新失败;
    • 如果跟新的只是单个属性(非_id),则会跟新除_id之外的所有属性;
    • 默认只更新选择的一个文档;

    修改器

    $set

    • 指定一个字段的值。如果这个字段不存在,则创建它;
    db.test.update({name: "jinks"}, {$set: {age: 24}});
    

    $unset

    • $set的对应,删除一个字段;
    db.test.update({name: "jinks"}, $unset: {age: 1});
    

    $inc

    • 专门来增加和减少数字;
      • 对于已经存在的键,会增加它的数值;
      • 只能用于整型、长整型或双精度浮点型的值,否则会报错;

    $ne

    • 筛选查询文档中没有此属性的文档
    //会更新一个name值不是jinks的文档
    
      db.foot.update({name: {$ne: 'jinks'}},{$set: {age: 24}})`,
    

    $push

    • 向已有的数组末尾加入一个元素,要是没有就 创建一个新的数组;
    • 默认一次只能加入一个,也可以同时使用$each加入多个;
    • 可以使用$slice设置固定的长度;
      * 正整数表示最早保存(数组最前)的n个数据;
      * 负整数表示最后保存(数组最后)的n个数据;
      * 0表示清空;
    • 可以使用$sort对数组对象进行排序;
      * 键值1表示最前面开始从高到低;
      * 键值-1表示最后面开始从高到低;
      * 数字按大小排序,字符串按字典排序;
      * 没有对应属性键值的数组值不进行排序;
    db.test.update({name: "jinks"}, {
      $push: {
         comments: {"name" : "joe", "email" : "joe@example.com"}
      }
    );
    //$each
    db.test.update({name: "jinks"}, {
      $push: {
         fruits: {"$each" : ["apple", "banana", "orange"]}
      }
    );
    //$slice
    db.test.update({name: "jinks"}, {
      $push: {
         fruits: {"$each" : [], $slice: -2}
      }
    );
    //$sort
    db.test.update({name: "jinks"}, {$push: {
      fruits: {
        "$each" : [{type: "apple", price: 12},{type: "banana", price: 5}], 
         "$slice": -1, 
         "$sort": {price: 1}
      }}
    );
    

    $addToSet

    • $push类型,但会避免重复添加相同的值;
    db.test.update({name: "jinks"}, {
      $addToSet: {
         fruits: {"$each" : ["apple", "banana", "orange"]}
      }
    );
    

    $pop

    • 每次按位置从数组中删除一个元素;
    • 正整数表示从最后开始删除;
    • 负整数表示从最前开始删除;
    db.test.update({name: "jinks"}, {
      $pop: {
         fruits: -1
      }
    );
    

    $pull

    • 按特定键值从数组中删除一个元素;
    db.test.update({name: "jinks"}, {
      $pull: {
         fruits: {type: "apple", price: 12}
      }
    );
    

    基于数组的快速修改

    • 按照下标直接操作
    db.test.update({name: "jinks"}, { 
      $set: {
        'fruits.2.type': 'newType'
      }
    );
    
    • 按照查询文档修改
    db.test.update({‘fruit.type’: 'apple'}, { 
      $set: {
        'fruits.$.type': 'newType'
      }
    );
    

    修改器速度

    • 有的修改器不需要改变文档的大小,只需要将键的值修改一下,运行速度快;
    • 有的数组修改器可能会改 变文档的大小,就会慢一些;
    • 新插入和修改后的文档都会放在最后;

    保存更新文档

    特殊的更新

    • db.collection.update(query, update, [true/{upsert: true}]); 第三个参数

    • 要是没有找到符合更新条件的文档,就会以这个条 件和更新文档为基础创建一个新的文档;

    • 如果找到了匹配的文档,则正常更新;

    保存更新

    • db.collection.save(data);
    • save是一个shell函数;
    • 它只有一个参数:文档;
    • 如果文档不存在,它会自动创建文档;如果文档存在,它 就更新这个文档;
    • 要是这个文档含有_id键,save会调用upsert;否则,会调用insert;

    更新多个文档

    • 在使用修改器中可以设定options: {multi: true},开启多个文档修改; 第四个参数

    返回更新文档

    • db.collection.findAndModify(document)

    • 一般更新操作返回的都是更新的结果;

    • 注意返回的是一个被更新之前的文档;

    //
    db.collection.findAndModify({
        query: <document>,
        sort: <document>,
        remove: <boolean>,
        update: <document>,
        new: <boolean>,
        fields: <document>,
        upsert: <boolean>
    });
    
    //
    db.test.findAndModify({
      query: {name: "jinks"}, 
      update: {
        $set: {
          fruits: {type: "apple", price: 13}
        }
    });
    
  • 相关阅读:
    [Spring开发]获取上下文对象
    [Dubbo开发]Dubbo日志插件实现(打包)
    [Dubbo开发]Dubbo日志插件实现(未打包)
    [Java开发]打印当前路径到控制台
    [Dubbo开发]Dubbo拦截器(Filter)初探
    [Dubbo开发]配置简单的生产者和消费者
    [Dubbo开发]Zookeeper配置
    [Dubbo开发]Maven安装与配置
    EL表达式的特性
    oracle中rownum的使用
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4779181.html
Copyright © 2011-2022 走看看