12 mongodb
我想将单个文档保存到Mongo JS shell中的变量中,并为后面的操作操作文档(读/写几个属性),但Mongo JS似乎没有在变量中添加任何内容:
> a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
>
Run Code Online (Sandbox Code Playgroud)
mongo支持使用吗?还是有错?
bpr*_*ard 24
你需要var像这样使用:
> var a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
Run Code Online (Sandbox Code Playgroud)
做一些测试我注意到该find()方法确实将变量设置为游标.在这些情况下,您将在下一个语句后丢失变量.
> var a = db.col.find().limit(1)
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> var b = 'test'
> a
>
Run Code Online (Sandbox Code Playgroud)
如果需要将变量保持更长时间,请在使用之前尝试显式迭代变量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
}
]
Run Code Online (Sandbox Code Playgroud)
Rob*_*tam 15
find返回一个游标.游标只能枚举一次,所以一旦你枚举了一个游标,它就到了最后并且不再生成任何文档.因此,在下面的示例中,变量a被赋予一个游标值,并且我们第一次在shell中评估"a"时,它会回显枚举游标的结果.我们第二次评估"a"它再次枚举光标,但这次光标为空,因此没有文件被回显:
> var a = db.test.find().limit(1)
> a
{ "_id" : ObjectId("52dfccba5fd17fe6a4d0051a"), "a" : 16807, "b" : 475249 }
> a
>
Run Code Online (Sandbox Code Playgroud)
前面的示例即使您使用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 }
>
Run Code Online (Sandbox Code Playgroud)
如果您只需要一个元素并希望避免另一个答案中描述的“丢失变量”问题,您可以使用findOne()代替find():
> var doc = db.col.findOne()
Run Code Online (Sandbox Code Playgroud)
doc以这种方式设置的变量将是永久的。
| 归档时间: |
|
| 查看次数: |
27585 次 |
| 最近记录: |