我想将单个文档保存到Mongo JS shell中的变量中,并为后面的操作操作文档(读/写几个属性),但Mongo JS似乎没有在变量中添加任何内容:
> a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
>
mongo支持使用吗?还是有错误?
答案 0 :(得分:24)
您需要像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()
进行设置之前显式迭代变量。
> var a = db.col.find().limit(1).toArray()
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> var b = 'test'
> a
[
{
"_id" : ObjectId("52dfccba5fd17fe6a4d0051a"),
"a" : 16807,
"b" : 475249
}
]
答案 1 :(得分:15)
find返回一个游标。游标只能枚举一次,所以一旦你枚举了一个游标,它就到了最后并且不再生成任何文件。所以在下面的例子中,变量a被分配了一个光标值,并且我们第一次评估" a"在shell中,它回显了枚举游标的结果。我们第二次评估" 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 }
>
答案 2 :(得分:3)
如果您只想要一个元素,并希望避免另一个答案中描述的“丢失变量”问题,则可以使用findOne()
代替find()
:
> var doc = db.col.findOne()
以这种方式设置的doc
变量将是永久性的。
答案 3 :(得分:1)
find()
的结果是一个游标。将文档放入名为“结果”的变量中:
var cur = db.col.find().limit(1);
if (cur.hasNext()) {
var result = cur.next();
printjson(result);
}
请注意,findOne()
直接返回结果,因此您可以执行var result = db.col.findOne()
。
答案 4 :(得分:0)
如果您使用aggregate
或find
进行查询,则最好使用var
:
var result = db.mycollector.find()
print(result._batch[0]) // get first element