rfsdw 发表于 2014-9-2 09:20:54

mongodb(四):查询数组、查询内嵌文档及$where子句

                                一.   查询数组        准备数据:
                                                                                                                        >db.foo.insert({"_id":1,"fruit":["apple","banana","peach"]})                               
                                                                        >db.foo.insert({"_id":2,"fruit":["apple","kumquat","orange"]})                               
                                                                        > db.foo.insert({"_id":3,"fruit":["cherry","banana","apple"]})                                                                       
       
        1.”$all” 同时匹配数组中多个元素
                                                                                                                        >db.foo.find({"fruit":{"$all":["apple","banana"]}}).pretty()                                                                                   
                                                                        { "_id" : 1, "fruit": [ "apple", "banana", "peach" ] }                               
                                                                        { "_id" : 3, "fruit" : [ "cherry","banana", "apple" ] }                                                                       
       
        2.”$size” 查询指定长度的数组
                                                                                                                        >db.foo.find({"fruit":{"$size":3}}).pretty()                               
                                                                        { "_id" : 1, "fruit": [ "apple", "banana", "peach" ] }                               
                                                                        { "_id" : 2, "fruit": [ "apple", "kumquat", "orange" ] }                               
                                                                        { "_id" : 3, "fruit" : [ "cherry","banana", "apple" ] }                                                                       
       
        3.”$slice”返回数组的一个子集        准备数据:
                                                                                                                        > db.blog.insert({                                   
                                                                        ... "title":"My blogpost",                               
                                                                        ... "content":"...",                               
                                                                        ... "comments":[                               
                                                                        ...{"name":"joe","mail":"joe@gmail.com","content":"goodpost."},                               
                                                                        ... {"name":"john","mail":"john@qq.com","content":"badpost."},                               
                                                                        ...{"name":"lucy","mail":"lucy@163.com","content":"nothing."}                                
                                                                        ... ]})                                                                       
       
        返回comments前两条数据:
                                                                                                                        >db.blog.find({},{"comments":{"$slice":2}}).pretty()                                                                                            
                                                                        {                               
                                                                        "_id" :ObjectId("53f80afaef3c1aec16179f15"),                               
                                                                        "title" : "My blogpost",                               
                                                                        "content" : "...",                               
                                                                        "comments" : [                               
                                                                        {                               
                                                                        "name" : "joe",                               
                                                                        "mail" :"joe@gmail.com",                               
                                                                        "content" : "goodpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "john",                               
                                                                        "mail" :"john@qq.com",                               
                                                                        "content" : "badpost."                               
                                                                        }                               
                                                                        ]                               
                                                                        }                                                                       
       
        返回comments的后两条数据
                                                                                                                        >db.blog.find({},{"comments":{"$slice":-2}}).pretty()                                
                                                                        {                               
                                                                        "_id" :ObjectId("53f80afaef3c1aec16179f15"),                               
                                                                        "title" : "My blogpost",                               
                                                                        "content" : "...",                               
                                                                        "comments" : [                               
                                                                        {                               
                                                                        "name" : "john",                               
                                                                        "mail" :"john@qq.com",                               
                                                                        "content" : "badpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "lucy",                               
                                                                        "mail" :"lucy@163.com",                               
                                                                        "content" :"nothing."                               
                                                                        }                               
                                                                        ]                               
                                                                        }                                                                       
       
        “$slice”也可以接受偏移值和要返回的元素数量,来返回中间的结果
                                                                                                                        >db.blog.find({},{"comments":{"$slice":}}).pretty()                               
                                                                        {                               
                                                                        "_id" :ObjectId("53f80afaef3c1aec16179f15"),                               
                                                                        "title" : "My blogpost",                               
                                                                        "content" : "...",                               
                                                                        "comments" : [                               
                                                                        {                               
                                                                        "name" : "john",                               
                                                                        "mail" :"john@qq.com",                               
                                                                        "content" : "badpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "lucy",                               
                                                                        "mail" :"lucy@163.com",                               
                                                                        "content" :"nothing."                               
                                                                        }                               
                                                                        ]                               
                                                                        }                                                                       
       
        二.   查询内嵌文档        数据为上例的blog        1.使用点连接
                                                                                                                        >db.blog.find({"comments.name":"lucy"}).pretty()                               
                                                                        {                               
                                                                        "_id" : ObjectId("53f80afaef3c1aec16179f15"),                               
                                                                        "title" : "My blogpost",                               
                                                                        "content" : "...",                               
                                                                        "comments" : [                               
                                                                        {                               
                                                                        "name" : "joe",                               
                                                                        "mail" :"joe@gmail.com",                               
                                                                        "content" : "goodpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "john",                               
                                                                        "mail" :"john@qq.com",                               
                                                                        "content" : "badpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "lucy",                               
                                                                        "mail" :"lucy@163.com",                               
                                                                        "content" :"nothing."                               
                                                                        }                               
                                                                        ]                               
                                                                        }                                                                       
       
        2.需要查询评论作者是"lucy",内容是"nothing."的博客:使用”$elemMatch”
                                                                                                                        >db.blog.find({"comments":{"$elemMatch":{"name":"lucy","content":"nothing."}}}).pretty()                                                                                                        {                               
                                                                        "_id" :ObjectId("53f80afaef3c1aec16179f15"),                               
                                                                        "title" : "My blogpost",                               
                                                                        "content" : "...",                               
                                                                        "comments" : [                               
                                                                        {                               
                                                                        "name" : "joe",                               
                                                                        "mail" :"joe@gmail.com",                               
                                                                        "content" : "goodpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "john",                               
                                                                        "mail" :"john@qq.com",                               
                                                                        "content" : "badpost."                               
                                                                        },                               
                                                                        {                               
                                                                        "name" : "lucy",                               
                                                                        "mail" :"lucy@163.com",                               
                                                                        "content" : "nothing."                               
                                                                        }                               
                                                                        ]                               
                                                                        }                                                                       
       

        三.   “$where”查询        准备数据
                                                                                                                        > db.foo.drop()                                                                                                        >db.foo.insert({"apple":1,"banana":6,"peach":3})                                                    
                                                                        >db.foo.insert({"apple":8,"spinach":4,"watermelon":4})                                                                       
       
        在第二个文档中,”spinach”和”watermelon”的值相同,要查询该文档,如下所示:
                                                                                                                        >db.foo.find({"$where":function(){                                                                    
                                                                        ... for(var current in this){                               
                                                                        ...       for(var other in this) {                               
                                                                        ...            if(current != other &&this == this){                               
                                                                        ...                return true;                               
                                                                        ...             }                               
                                                                        ...       }                               
                                                                        ... }                               
                                                                        ... return false;                               
                                                                        ... }})                                                                                                                                         
                                                                        { "_id" :ObjectId("53f81783ef3c1aec16179f17"), "apple" : 8,"spinach" : 4, "watermelon" : 4 }                                                                       
                MongoDB在查询时,会将每个文档转换为一个javascript对象,这里的this就是一个文档指针,用两个指针分别指向当前文档的第一个字段,分别是other和current指针。函数要完成的功能是比较两个字段的值是否相等。用current作为比较的趟数,other来控制比较大小。         

页: [1]
查看完整版本: mongodb(四):查询数组、查询内嵌文档及$where子句