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

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)

  • `你在下一条语句之后丢失了变量`?? 在消耗完游标中的所有数据之前,它不会丢失https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/#cursor-behaviors (3认同)

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)


fga*_*lan 5

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

> var doc = db.col.findOne()
Run Code Online (Sandbox Code Playgroud)

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