14

我是 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(),但是是否可以从集合中提取一个文档?

4

3 回答 3

12

find方法返回一个游标。这就像结果集中的迭代器一样工作。如果您有太多结果并尝试将它们全部显示在屏幕上,shell 将只显示前 20 个,并且光标现在将指向结果集的第 20 个结果。如果您键入it接下来的 20 个结果将显示等等。

在您的示例中,我认为您在外壳中向我们隐藏了一行。

这个命令

> var collection = db.scores.find();

只会将结果分配给collection变量,不会在屏幕上打印任何内容。所以,这让我相信你也跑过:

> collection

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

你的语法没有错。您可以随时使用它。只要确保您的光标仍然打开并且有结果。您可以使用该collection.hasNext()方法。

于 2013-06-01T18:24:48.790 回答
2

那是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()返回一个游标,而不是一个数组。在文档中,您可以看到可以在 cursor 上调用的方法

findOne()返回单个文档,并且应该适用于您要完成的工作。

于 2013-05-31T23:03:29.213 回答
0

所以你可以有几个选择。

使用 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;

如果您要在文档中查找特定对象,您可以编写查询并在所有文档中搜索它。您可以使用 findOne 方法或简单地查找并获取与您的查询匹配的对象列表。见下文:

DBObject query = new BasicDBObject();
query.put(SOME_ID, ID);
DBObject result = db.getCollection(COLLECTION_NAME).findOne(query) // for a single object
DBCursor cursor = db.getCollection(COLLECTION_NAME).find(query) // for a cursor of multiple objects
于 2013-05-31T22:51:41.300 回答