Mongodb 如何将查询结果(单个文档)存储到变量中?

Mongodb 如何将查询结果(单个文档)存储到变量中?,mongodb,Mongodb,我想将一个文档保存到Mongo JS shell中的一个变量中,并为后面的操作操作该文档(读/写多个属性),但Mongo JS似乎没有在变量中放入任何内容: > a = db.col.find().limit(1) { "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 } > a > mongo支持这种用法吗?还是有错误?您需要像这样使用var: > var a = db.co

我想将一个文档保存到Mongo JS shell中的一个变量中,并为后面的操作操作该文档(读/写多个属性),但Mongo JS似乎没有在变量中放入任何内容:

> a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
>

mongo支持这种用法吗?还是有错误?

您需要像这样使用
var

> var a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
在进行一些测试时,我注意到
find()
方法似乎正在将变量设置为光标。在这些情况下,在下一条语句之后将丢失变量

> var a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> var b = 'test'
> a
>
如果需要将变量保留更长时间,请尝试在使用
toArray()
设置变量之前显式迭代该变量


find返回一个游标。游标只能枚举一次,因此,一旦您枚举了游标,它将到达末尾,并且不会生成更多文档。因此,在下面的示例中,变量a被指定了一个游标值,当我们第一次在shell中计算“a”时,它会回显枚举游标的结果。第二次我们求值“a”时,它再次枚举光标,但这次光标为空,因此不会回显任何文档:

> var a = db.test.find().limit(1)
> a
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
>
上一个示例返回一个游标,即使您使用了limit(1)。并不是“a”失去了它的值,它仍然引用同一个游标,只是它引用的游标已经到达了它的终点

如果要读取单个文档并使返回值为文档而不是光标,请使用findOne:

> var a = db.test.findOne()
> a
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
>

如果您只需要一个元素,并且希望避免另一个答案中描述的“丢失变量”问题,则可以使用
findOne()
而不是
find()


以这种方式设置的
doc
变量将是永久的。

如果使用
aggregate
find
进行查询,最好使用
var

var result = db.mycollector.find()
print(result._batch[0]) // get first element
find()
的结果是一个光标。要将文档放入名为“result”的变量中,请执行以下操作:


请注意,
findOne()
直接返回结果,因此您可以执行
var result=db.col.findOne()

这是一个比bpruitt goddard更直接的答案。如果您只查找一个文档,这将按照您预期的方式工作。感谢您的解释,我一直想知道为什么我的变量第一次只保留该值,但光标的解释完全有意义。
在下一条语句后您会丢失该变量。
??在使用光标中的所有数据之前,它不会丢失
> var doc = db.col.findOne()
var result = db.mycollector.find()
print(result._batch[0]) // get first element
var cur = db.col.find().limit(1);
if (cur.hasNext()) {
    var result = cur.next();
    printjson(result);
}