之前已经已经介绍了skip和limit方法,我们可以依靠它们跳转到需要的文档位置和文档范围。
本文将给出如果使用游标来进行遍历的方法:
> var cur=db.teachers.find()
> cur.hasNext()
true
> cur.next()
{
"_id" : ObjectId("5500f4031c8361936a1e6a08"),
"name" : "Mr A",
"age" : 40,
"graduates" : [
{
"name" : "Zhang",
"age" : 22
},
{
"name" : "Yao",
"age" : 23,
"phone" : [
"13100001111"
]
},
{
"name" : "Chen",
"age" : 24,
"gender" : "male"
}
]
}
> cur.hasNext()
true
> x=cur.next()
{
"_id" : ObjectId("5500f45a1c8361936a1e6a09"),
"name" : "Mr B",
"age" : 45,
"graduates" : [
{
"name" : "Hou",
"age" : 30
},
{
"name" : "Liu",
"age" : 23,
"phone" : [
"13200001111"
]
},
{
"name" : "Ding",
"age" : 25,
"gender" : "female"
}
]
}
> x.level="Professor"
Professor
> x
{
"_id" : ObjectId("5500f45a1c8361936a1e6a09"),
"name" : "Mr B",
"age" : 45,
"graduates" : [
{
"name" : "Hou",
"age" : 30
},
{
"name" : "Liu",
"age" : 23,
"phone" : [
"13200001111"
]
},
{
"name" : "Ding",
"age" : 25,
"gender" : "female"
}
],
"level" : "Professor"
}
> db.teachers.find({_id:ObjectId("5500f45a1c8361936a1e6a09") })
{ "_id" : ObjectId("5500f45a1c8361936a1e6a09"), "name" : "Mr B", "age" : 45, "graduates" : [ { "name" : "Hou", "age" : 30 }, { "name" : "Liu", "age" : 23, "phone" : [ "13200001111" ] }, { "name" : "Ding", "age" : 25, "gender" : "female" } ] }
>
> x.graduates.length
3
过程见以上代码。值的注意的是,x保存了cur遍历到的Json对象,但是对其修改是不会影响到原集合的。如果需要保存修改,可以用save方法,db.teachers.save(x)。
第二个需要注意的是,keyvalue是Json数组的key,获取数组长度的方法,x.graduates.length。以后可以用JS代码for循环来便利这样的json数组。
第三个需要注意的是,当cur.hasNext()为false时表示遍历结束。如果这时候继续cur.next(),会报异常,并不是返回空。