2014-01-22 2 views
9

하나의 문서를 Mongo JS 셸의 변수에 저장하고 후자의 작업을 위해 문서를 조작 (여러 속성 읽기/쓰기)하고 싶습니다. Mongo JS는 변수에 아무 것도 넣지 않는 것 같습니다 :쿼리 결과 (단일 문서)를 변수에 저장하는 방법은 무엇입니까?

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

mongo가 사용을 지원합니까? 아니면 실수가 있었습니까?

답변

20

은 당신과 같이 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 
    } 
] 
10

find는 커서를 반환합니다. 커서는 한 번만 열거 할 수 있으므로 커서를 열거하면 커서가 끝나고 더 이상의 문서가 생성되지 않습니다. 따라서 다음 예제에서 변수 a에 커서 값이 할당되고 처음으로 셸에서 "a"를 계산할 때 커서를 열거 한 결과가 반영됩니다. 우리가 evalute 두 번째로는 "a"는 그것을 다시 커서를 열거하지만, 이번에는 커서가 그래서 문서 에코되지 비어 :

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

앞의 예는 제한 (1)을 사용하는 경우에도 커서를 반환합니다. "a"가 값을 잃지 않고, 여전히 같은 커서를 가리키는 것이 아니라, 커서가 가리키는 커서가 끝났습니다.

당신은 하나의 문서를 읽고 반환 값을 가질 수 대신 커서 사용 findOne의 문서를 할 경우 : "변수를 잃을"

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

이것은 bpruitt-goddard에 의한 답변보다 더 직접적인 대답입니다. 하나의 문서 만 찾고있는 경우 작동하는 방식대로 작동합니다. – JackAce

+0

설명해 주셔서 고맙습니다. 왜 내 변수가 처음으로 값을 보유하고 있는지 궁금해했으나 커서 설명이 완전히 의미가 있습니다. –

2

을 당신은 단지 하나 개의 요소를 원하는 경우와 피하고 싶은 당신이 findOne() 대신 find() 사용할 수있는 또 다른 답변에 설명 된 문제 : 그 방법으로

> var doc = db.col.findOne() 

doc 변수 세트는 영구적 일 것입니다.

관련 문제