• windows下mongodb基础玩法系列二CURD附加一


    windows下mongodb基础玩法系列
    说在前面的话
    在系列二中CURD只是简单的走了一下代码操作的流程,其中全是简单基础操作的内容, 在我仔细看完接下来的内容后决定再丰富一下前面的操作,并实战一个简单的demo出来,demo具体搭配语言暂时决定在PHP与nodejs之间。
    增加内容至文档没说完的那些事儿

    目录

    集合的创建与返回值

    ①在插入文档到集合的时候,如果集合不存在,增加内容到文档的这个操作就自动创建集合。这一点和mysql有些不一样,mysql必须先创建库、表,再增加内容到表中。
    ②这一次就不实际操作截图了,按照之前的操作我又走看一遍,这一次留意了一个小的细节。增加内容成功后会返回一个WriteResult({"nInserted":1}),这个对象表示了插入的条数。

    增加多个文档的方法

    ①创建一个数组文档,在增加数组文档即可。
    //用数组存放多个文档
    var users = [{
        "name":"A",
        "age":32
    },{
        "name":"B",
        "age":33
    },{
        "name":"C",
        "age":34
    }];
    //添加数组操作
    db.testData.insert(users);
    
    View Code
    ②在2.6版本之后提供了一个可以用来增加多个文档的API,具体操作流程展开代码。
    //初始化bulk()
    var bulk = db.testData.initializeUnorderedBulkOp();//无序列表操作
    //var bulk = db.collection.initializeOrderedBulkOp();//有序列表操作
    //insert至bulk对象
    bulk.insert({
        "name":"A",
        "age":20
    });
    bulk.insert({
        "name":"B",
        "age":21
    });
    //调用bulk对象的execute()方法添加文档至集合
    bulk.execute();
    View Code
    这里只是描述一下有这两个方法,暂时不做深入学习,感觉挺需要深入学习的一点,后续跟踪一下。
    查找内容没说完的那些事儿

    目录

    指定查询与条件查询使用

    前面的学习中已经学会了简单的指定查询与条件查询,综合运用就是,例,我们要找出姓名是A,或者年龄是33/34的所有人(随意营造的条件)。此时我把之前随意添加的数据再添加了两次用于这次测试。
    db.testData.find({$or:[{"name":"A"},{"age":{$in:[33,34]}}]});
    View Code

    嵌入式(Embedded)文档查询的方法

    //插入模拟数据
    db.testData.insert([{
        "name":"unofficial",
        "age":18,
        "other":{
            "hobby":["eat","drink","play","happy"],
            "speciality":["hands","legs"]
        },
            "score":[58,59,60]
    },{
        "name":"pushself",
        "age":100,
        "other":{
            "hobby":["play"],
            "speciality":["legs"]
        },
            "score":[60,70,80]
    }]);
    //成绩分别对应语数外,找到语文成绩小于60的同学的姓名
    db.testData.find({"score.0":{$lt:60}},{"_id":0, "name":1});
    //把好吃的家伙的名字查出来
    db.testData.find({"other.hobby":"eat"},{"_id":0, "name":1});
    View Code

    限制查询

    在find()时,在第二个参数中控制对应需要的键值对,例如我不需要_id,只是需要显示姓名,我就可以把第二个参数设置为{"_id":0,"name":1}。

    反复的切换光标读取

    //执行查找操作
    var rs = db.testData.find({});
    //遍历
    while(rs.hasNext()) {
        print(tojson(rs.next()));//也可以使用printjson(rs.next());
    }
    View Code
    其中的while也可以使用myCursor.forEach(printjson);代替操作

    查询的性能问题

    取决于索引的创建,引入一个explain()方法反应查询性能的数据。
    //插入一组测试数据
    db.testData.insert([
        { "_id" : 1, "item" : "f1", type: "food", quantity: 500 },
        { "_id" : 2, "item" : "f2", type: "food", quantity: 100 },
        { "_id" : 3, "item" : "p1", type: "paper", quantity: 200 },
        { "_id" : 4, "item" : "p2", type: "paper", quantity: 150 },
        { "_id" : 5, "item" : "f3", type: "food", quantity: 300 },
        { "_id" : 6, "item" : "t1", type: "toys", quantity: 500 },
        { "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 },
        { "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 },
        { "_id" : 9, "item" : "t2", type: "toys", quantity: 50 },
        { "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
    ]);
    //执行查找操作
    db.testData.find({"type":"food"});
    //nscanned 和 nscannedObjects 显示 10 表明MongoDB不得不扫描十文档 (即集合中的所有文档)找到这四个匹配文档。
    //如果给type添加一个索引
    db.testData.ensureIndex({"type":1})
    //再执行查询操作的时候就查询四个索引文档,并返回了四个文档内容
    
    //复合索引的性能
    db.testData.ensureIndex( { quantity: 1, type: 1 } );
    db.testData.ensureIndex( { type: 1, quantity: 1 } );
    //明显通过数据可以看出性能的差异,更多的后面的学习文章争取分析一下查询优化
    View Code
    删除操作
    针对前面的内容,这里暂时只是补充一点内容就是通过条件匹配到的内容,只是删除一条内容的时候,第二个参数设置为1即可。 db.testData.remove({"type":"food"}, 1);
  • 相关阅读:
    显示数据库中的数据
    C# 替换去除HTML标记方法(正则表达式)
    aspx,ascx和ashx使用总结
    groupby用法
    C#的一个URL加载器,能处理编码、相对地址解析、GET/POST、HTML的include、页面重定向
    js调用WebService的例子
    跨站点的单点登录
    新安装的Centos7不能联网且ifconfig出现command not found
    virtualbox桥接网卡设置
    2012暑假Ajax学习笔记
  • 原文地址:https://www.cnblogs.com/unofficial/p/4034209.html
Copyright © 2020-2023  润新知