2017-03-25 3 views
1

저는 최신 MongoDB 3.4를 사용하며 모든 집계 호출이 잘 작동하는 모든 응용 프로그램을 로컬로 구축하고 있습니다. MongoDb 집합체에 오류가 발생했습니다.

app.get('/random_menu', function (req, res) { 
    Menus.aggregate([{$sample: {size: 1}}], function (err, data) { 
     res.json(data); 
    }); 
}); 

는 지금 MongoDB를 2.4.10로 제한됩니다 내 라즈베리 파이에 내 코드를 이동하고 내 집계 함수가 작동하지 않습니다 보인다. 내 앱에서 데이터를 반환하지 않으며 오류가 없습니다.

내가 로컬 3.4 버전에서 잘 작동 다음으로, RoboMongo를 통해 그것을 시도 테스트하려면 :

db.getCollection('menus').aggregate([{$sample: {size: 1}}]) 

을하지만 RoboMongo를 통해 파이 DB에 그것을 시도 할 때, 나는 다음과 같은 오류가 발생합니다 :

assert: command failed: { 
    "errmsg" : "Pipeline::parseCommand(): unrecognized field \"cursor", 
    "ok" : 0 
} : aggregate failed 
[email protected]/mongo/shell/utils.js:23:13 
[email protected]/mongo/shell/assert.js:13:14 
[email protected]/mongo/shell/assert.js:266:5 
[email protected]/mongo/shell/collection.js:1215:5 
@(shell):1:1 

Error: command failed: { 
    "errmsg" : "Pipeline::parseCommand(): unrecognized field \"cursor", 
    "ok" : 0 
} : aggregate failed : 
[email protected]/mongo/shell/utils.js:23:13 
[email protected]/mongo/shell/assert.js:13:14 
[email protected]/mongo/shell/assert.js:266:5 
[email protected]/mongo/shell/collection.js:1215:5 
@(shell):1:1 

나는 이것을 검색해 봤지만 아무것도 찾을 수 없습니다. 필자는 MongoDB를 새롭게 접하기 때문에 모든 입력을 크게 높이 평가할 것입니다.

답변

1

MongoDB 2.4는 2013 년 3 월에 처음 릴리스되었으며 2016 년 3 월 (MongoDB 3.4.0이 출시되기 6 개월 전)에 종료되었습니다. 최신 릴리스에 대한 테스트는 이전 버전과 호환되지 않는 기능이나 API를 실수로 사용하게 만듭니다. 누락 된 기능 외에도 수명이 다한 서버 릴리스에는 중요한 버그 수정 및 보안 향상 기능이 누락되어 현재 드라이버 릴리스에 대해 더 이상 테스트되지 않습니다. MongoDB를 3.2에서 추가되었다

  • $sample 집계 단계 :

    귀하의 질문은 MongoDB를 2.4에 존재하지 않았던 두 가지 기능 문제를 강조한다.

    MongoDB의 3.2 이전 버전으로 샘플링하는 방법은 응용 프로그램 코드에 mongodb-collection-sample NPM 패키지를 사용하는 것이 좋습니다. 지원되는 경우 $sample을 사용하거나 이전 버전의 MongoDB에 대해서는 reservoir sampling 알고리즘을 사용합니다.

  • MongoDB 2.6에 추가 된 커서 기반 집계.

    이 오류는 unrecognized field "cursor" 오류로 표시됩니다. MongoDB 2.6+ 드라이버는 큰 결과 집합을 반복하기 위해 커서를 사용하는 것이 기본값입니다. 이전 버전은 인라인 결과 (최대 16MB)로 제한되었습니다. 귀하의 Robomongo 버전은 MongoDB 2.4보다 새로운 쉘 (version()으로 확인할 수 있음)을 임베드하고 aggregate() 도우미로 2.4 스타일 집계 쿼리를 지원하는 것으로 보이지 않습니다. aggregate() 도우미 대신 db.runCommand()을 통해 aggregate을 호출하는 대체 구문이 있지만 더 나은 방법은 지원되는 서버 버전으로 업그레이드하는 것입니다.

당신이 MongoDB를 처음 사용하는 경우, 나는 확실히 가능한 dev에 & 배포 환경에서 지원 릴리스 (MongoDB를 3.0 3 월, 2017에서 같은 새로운)와 같은 주요 버전을 사용을 사용하는 것이 좋습니다 것입니다.

MongoDB 3.4와 마찬가지로, Raspberry Pi는 공식적으로 지원되는 플랫폼이 아닙니다. 그러나 다른 사람들이 성공한 사람은 community packages for ArchLinux ARM입니다.Raspberry Pi의 제한된 하드웨어 자원은 일반적으로 많은 양산에 적합하지 않으므로 Pi 응용 프로그램을 실행하는 데 Pi를 사용하지만 원격으로 호스팅되는 데이터베이스 서버에 연결하는 것이 좋습니다.

+1

철저한 설명과 조언을 주신 @Stennie에게 감사드립니다. – Andrew

1

$sample은 v3.2에서 사용할 수 있습니다.

+0

감사합니다. Alex, 동일한 기능을 사용하기 위해 사용할 수있는 대안이 있습니까? – Andrew

+0

아니요, 콜렉션에서 무작위 문서 만 필요하다면'db.getCollection ('menus'). find(). skip (random_number) .limit (1)', random_number는 0과'db .getCollection ('menus'). find(). count()' –

관련 문제