插入、删除和更新

插入

db.foo.insert({"bar": "baz"})

插入校验

理解:
* 数据能够解析成BSON形式
* 拥有_id字段
* 文档不能超过4MB

批量插入

理解:批量插入能传递一个由文档组成的数组给数据库

删除

db.users.remove({})

理解:
* 接受一个查询文档,所有能够被该查询出的文档都会被删除
* remove不会删除索引

删除速度

理解:如果想要删除集合中的所有文档和索引,应该直接删除集合,这样速度更快

更新

理解:
* 第一个参数负责找到需要修改的文档,
* 第二个参数负责修改的文档
* 第三个参数没有找到文档时,是否创建一个文档
* 第四个参数指定是否全部修改
* 原子性,两个更新同时发生,先到达数据库的先执行

操作方式

理解:
* 替换,用一个完成的文档,替换掉原先的文档
* 部分修改;update({}, {})

  • 修改一个键的值,如果不存在就创建;$set;P28
  • 删除一个键;$unset;P29
  • 增加或者减少一个数的值,如果不存在就创建;$inc;P30
  • 数组修改;P31
    • 数组末尾添加数据,如果不存在就创建;$push
    • 数组末尾添加数据,如果不存在就创建,但如果已经存在,则不重复添加;$addToSet
    • 批量添加数据,与push和addToSet配合使用;$each
    • 从尾部或头部删除一个数据;$pop
    • 删除数组中的指定数据,相同的数据也会删除;$pull
    • 修改指定位置数据;P34
  • 没有找到需要修改的文档,就创建一个新的文档;P36;update({}, {}, true)
  • 更新多个文档;P38;update({}, {}, true, true)
  • shell中快速修改文档;save;P37
  • 当更新或删除操作的查询用到排序时,为了避免同时错误,应该是findAndModify合并操作;P38

修改速度 P35

理解:
* 如果操作不影响文档大小,速度会很快
* 大小发生改变时,需要分配空间,因此速度会变慢
* 当数组需要频繁添加数据时,可以考虑将内嵌数组

替换

查阅:

db.nums.update({num: 1}, {num: 111})

注意:

{"_id": 1, "name": "joe", "age": 20}
{"_id": 2, "name": "joe", "age": 30}
// 执行下面的操作, 本想修改第二个文档,但是却修改了第一个文档
db.people.update({"name": "joe"}, {"_id": 2, "name": "joe", "age": 31})

注:页面代表,在MongoDB权威指南第一版中的页数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态链表是一种使用数组来实现的链表。在静态链表中,每个节点都包含一个数据元素和一个指向下一个节点的索引。 静态链表的插入操作分为两步: 1. 需要找到插入位置的前一个节点。 2. 在数组中找到一个空闲位置,将新节点插入,并更新前一个节点的指针。 静态链表的删除操作也分为两步: 1. 需要找到要删除节点的前一个节点。 2. 将要删除节点的索引释放,并更新前一个节点的指针。 以下是示例代码实现静态链表的插入删除操作: ```cpp #include <iostream> const int MAX_SIZE = 100; // 最大容量 struct Node { int data; int next; }; class StaticLinkedList { public: StaticLinkedList() { for (int i = 0; i < MAX_SIZE; i++) { nodes[i].next = -1; // 初始化所有节点的next为-1,表示空节点 } head = -1; // 初始化头节点 } // 插入操作 void insert(int value) { int newNodeIndex = getFreeNodeIndex(); if (newNodeIndex == -1) { std::cout << "链表已满,无法插入新节点" << std::endl; return; } nodes[newNodeIndex].data = value; if (head == -1) { head = newNodeIndex; } else { int current = head; while (nodes[current].next != -1) { current = nodes[current].next; } nodes[current].next = newNodeIndex; } } // 删除操作 void remove(int value) { if (head == -1) { std::cout << "链表为空,无法删除节点" << std::endl; return; } int prev = -1; int current = head; while (current != -1 && nodes[current].data != value) { prev = current; current = nodes[current].next; } if (current == -1) { std::cout << "未找到要删除的节点" << std::endl; return; } if (prev == -1) { head = nodes[current].next; } else { nodes[prev].next = nodes[current].next; } releaseNodeIndex(current); } // 打印链表 void print() { int current = head; while (current != -1) { std::cout << nodes[current].data << " "; current = nodes[current].next; } std::cout << std::endl; } private: Node nodes[MAX_SIZE]; int head; // 获取空闲的节点索引 int getFreeNodeIndex() { for (int i = 0; i < MAX_SIZE; i++) { if (nodes[i].next == -1) { return i; } } return -1; // 没有空闲节点 } // 释放节点索引 void releaseNodeIndex(int index) { nodes[index].next = -1; } }; int main() { StaticLinkedList list; list.insert(1); list.insert(2); list.insert(3); list.print(); // 输出:1 2 3 list.remove(2); list.print(); // 输出:1 3 return 0; } ``` 这是一个简单的静态链表实现,你可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值