一. 查询数组 准备数据: > 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 blog post",
... "content":"...",
... "comments":[
... {"name":"joe","mail":"joe@gmail.com","content":"good post."},
... {"name":"john","mail":"john@qq.com","content":"bad post."},
... {"name":"lucy","mail":"lucy@163.com","content":"nothing."}
... ]}) |
返回comments前两条数据: > db.blog.find({},{"comments":{"$slice":2}}).pretty()
{
"_id" : ObjectId("53f80afaef3c1aec16179f15"),
"title" : "My blog post",
"content" : "...",
"comments" : [
{
"name" : "joe",
"mail" : "joe@gmail.com",
"content" : "good post."
},
{
"name" : "john",
"mail" : "john@qq.com",
"content" : "bad post."
}
]
} |
返回comments的后两条数据 > db.blog.find({},{"comments":{"$slice":-2}}).pretty()
{
"_id" : ObjectId("53f80afaef3c1aec16179f15"),
"title" : "My blog post",
"content" : "...",
"comments" : [
{
"name" : "john",
"mail" : "john@qq.com",
"content" : "bad post."
},
{
"name" : "lucy",
"mail" : "lucy@163.com",
"content" : "nothing."
}
]
} |
“$slice”也可以接受偏移值和要返回的元素数量,来返回中间的结果 > db.blog.find({},{"comments":{"$slice":[1,2]}}).pretty()
{
"_id" : ObjectId("53f80afaef3c1aec16179f15"),
"title" : "My blog post",
"content" : "...",
"comments" : [
{
"name" : "john",
"mail" : "john@qq.com",
"content" : "bad post."
},
{
"name" : "lucy",
"mail" : "lucy@163.com",
"content" : "nothing."
}
]
} |
二. 查询内嵌文档 数据为上例的blog 1.使用点连接 > db.blog.find({"comments.name":"lucy"}).pretty()
{
"_id" : ObjectId("53f80afaef3c1aec16179f15"),
"title" : "My blog post",
"content" : "...",
"comments" : [
{
"name" : "joe",
"mail" : "joe@gmail.com",
"content" : "good post."
},
{
"name" : "john",
"mail" : "john@qq.com",
"content" : "bad post."
},
{
"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 blog post",
"content" : "...",
"comments" : [
{
"name" : "joe",
"mail" : "joe@gmail.com",
"content" : "good post."
},
{
"name" : "john",
"mail" : "john@qq.com",
"content" : "bad post."
},
{
"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[current] == this[other]){
... return true;
... }
... }
... }
... return false;
... }})
{ "_id" : ObjectId("53f81783ef3c1aec16179f17"), "apple" : 8, "spinach" : 4, "watermelon" : 4 } |
MongoDB在查询时,会将每个文档转换为一个javascript对象,这里的this就是一个文档指针,用两个指针分别指向当前文档的第一个字段,分别是other和current指针。函数要完成的功能是比较两个字段的值是否相等。用current作为比较的趟数,other来控制比较大小。
|