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]