NoSql数据库初探-mongoDB环境搭建

发表于:2014-7-21 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lmtoo    来源:51Testing软件测试网采编

  此时的find方法会返回一个游标对象
  因为此时并没有一个变量接收该游标对象,所以会默认至多打印出20条数据(当然只会打印刚刚的那两条数据,因为我们的testData中只有这两条)
  { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
  { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
  _id属性是mongoDB自动生成的,因为每个文档都要有一个“主键”(跟关系型数据库中主键很像),而此时我们并没有提供_id。
  我们来试着添加更多的数据:
  在命令行中输入:
  for (var i = 1; i <= 25; i++) db.testData.insert( { x : i } )
  一个for循环,循环插入了25条数据
  我们再执行一下
  db.testData.find()
  结果输出

{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990be9"), "x" : 4 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990beb"), "x" : 6 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bec"), "x" : 7 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bed"), "x" : 8 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bee"), "x" : 9 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bef"), "x" : 10 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf0"), "x" : 11 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf1"), "x" : 12 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf2"), "x" : 13 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf3"), "x" : 14 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf4"), "x" : 15 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf5"), "x" : 16 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf6"), "x" : 17 }
{ "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
has more

  只输出了20条数据
  后面还有has more提示后面还有数据
  再在命令行中输入it会输出下一批20条数据
  如何才能将数据全部输出呢?
  此时我们用一个变量来接收游标:
  var c = db.testData.find()
  c就是游标对象
  此时我们通过for循环将全部数据输出:
  while ( c.hasNext() ) printjson( c.next() )
  printjson方法将文档以json的格式输出
  游标对象的hasNext方法用来判断是否还有下一个文档,而next方法用来获取下一个文档。
  如果我们只想获取第5个文档,该怎么办呢?
  当然可以在遍历游标的时候对遍历过的文档计数,并将第5个文档输出即可,但是这种方式确实是有点啰嗦了。
  我们此时可以在游标对象上直接添加一个下标即可,如:
  printjson( c [ 4 ] )
  此时输出了第5个文档
  { "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }
  但是此时请注意:
  c [ 4 ]方法会将所有该collection下的文档读取进内存,这相当于在游标上执行了cursor.toArray() 方法,
  此方法将所有的文档加载到了内存中,然后再在返回的数组中查找索引值是4的文档,所以游标下标方法应慎用啊
  如果我们想查询a是18的那个document该怎么办呢?
  此时我们还可以借助find方法,但是此时要给find方法提供一个模板文档
  一个模板文档详细描述了查询策略,如:db.testData.find( { x : 18 } )
  此时的{x:18}就是一个模板文档,是指查询文档时只保留x为18的文档。
  查询结果如下:
  { "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
  不要忘了,find方法返回一个游标对象,只不过此时的查询只有一个文档符合条件。
  如果只想返回一个文档,而不是游标对象,可以使用findOne方法,findOne方法返回一个文档对象,不管符合条件的文档有多少个,它只返回第一个。
  如果想对返回的文档数目进行限制,可以在游标上调用limit方法,如下:
  db.testData.find().limit(3)
  只会返回前3个文档
  结果如下:
  { "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
  { "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
  { "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号