Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:检索集合中的第一个文档_Mongodb - Fatal编程技术网

MongoDB:检索集合中的第一个文档

MongoDB:检索集合中的第一个文档,mongodb,Mongodb,我是Mongo新手,正在尝试从find()查询检索第一个文档: > db.scores.save({a: 99}); > var collection = db.scores.find(); [ { "a" : 99, "_id" : { "$oid" : "51a91ff3cc93742c1607ce28" } } ] > var document = collection[0]; JS Error: result is undefined 这有点

我是Mongo新手,正在尝试从
find()
查询检索第一个文档:

> db.scores.save({a: 99});
> var collection = db.scores.find();
[ 
  {   "a" : 99,   "_id" : {   "$oid" : "51a91ff3cc93742c1607ce28"   }   }
]
> var document = collection[0];
JS Error: result is undefined

这有点奇怪,因为集合看起来很像数组。我知道可以使用
findOne()
检索单个文档,但是可以从集合中提取一个吗?

这样您就可以有几个选项

使用Java作为语言,但一种选择是获取db游标并迭代返回的元素。或者干脆抓住第一个就跑

DBCursor cursor = db.getCollection(COLLECTION_NAME).find();
List<DOCUMENT_TYPE> retVal = new ArrayList<DOCUMENT_TYPE>(cursor.count());
while (cursor.hasNext()) {
    retVal.add(cursor.next());
}
return retVal;

那是Mongo贝壳吗?什么版本?当我尝试您键入的命令时,不会得到任何额外的输出:

MongoDB shell version: 2.4.3
connecting to: test
> db.scores.save({a: 99});
> var collection = db.scores.find();
> var document = collection[0];
在Mongo shell中,
find()
返回一个游标,而不是数组。在文档中,您可以看到


返回单个文档,并且应该对您试图完成的任务有效。

find方法返回光标。这类似于结果集中的迭代器。如果您有太多的结果并试图在屏幕上全部显示,shell将只显示前20个结果,光标现在将指向结果集的第20个结果。如果键入
it
,将显示接下来的20个结果,依此类推

在你的例子中,我认为你对我们隐藏了壳中的一条线

此命令

> var collection = db.scores.find();
只将结果分配给
集合
变量,不会在屏幕上打印任何内容。所以,这让我相信你也参加了:

> collection
现在,到底发生了什么。如果确实使用了上述命令来显示
集合的内容
,则光标将到达结果集的末尾(因为集合中只有一个文档),并且它将自动关闭。这就是为什么你得到了错误


您的语法没有问题。您可以随时使用它。只需确保您的光标仍处于打开状态并且有结果。您可以使用
collection.hasNext()
方法进行此操作。

find返回光标而不是文档。您可以将.toArray()添加到find()以将其转换为数组,但对于一个文档,您应该像其他人所说的那样使用findOne。@Asya-感谢您提到
toArray()
。这是实现我在示例代码中想要做的事情的一种方法,即使这不是最佳实践:-\。如果您使用“limit(x)”进行检索,其中x相当小,这是非常好的。我的示例代码是在
> collection