복붙노트

[MONGODB] 몽구스 집계 쿼리 / Mockgoose 시험은 다른 곳에서 작동 농담 실패

MONGODB

몽구스 집계 쿼리 / Mockgoose 시험은 다른 곳에서 작동 농담 실패

내 몽구스 모델에 대한 몇 가지 테스트를 만들려고 해요, 그리고 내가 농담 / Mockgoose 테스트는 속기 쿼리 / 통합 파이프 라인 통과 얻을 내가 검색하기 위해 만든 (첫 번째 코드 블록 아래 참조)하는 방법을 알아낼 수 없습니다 다른 모음에서 참조되지 않은 하나 개의 컬렉션에서 임의의 문서.

activitySchema.query.getUnused = function() {
    return Activity.aggregate()
        .lookup({
            from: 'userActivity',
            localField: '_id',
            foreignField: 'activity',
            as: 'matched_docs',
        })
        .match({ matched_docs: { $eq: [] } })
        .sample(1)
        .project({ matched_docs: 0, __v: 0 })
        .exec()
}

이 테스트입니다

describe('Activity methods', () => {
    test('Activity unused query executes', (done) => {
        function createActivity() {
            return Activity
                .create({ activity: 'running' })
                .then(activity => {
                    console.log('Activity is generated')
                    return Promise.resolve(true)
                })
        }
        async function retrieveActivity() {
            await createActivity()
            Activity
                .find()
                .getUnused()
                .then(unused => {
                    console.log(unused);
                    expect(unused).toHaveLength(1)
                    done()
                })
                .catch(x => {
                console.log(x)
                })
        }


        return retrieveActivity()
    })

})

샌드 노드 JS 코드 :

Activity.find().getUnused()
    .then((x) => {
     console.log(x);
})

나는 샌드 박스 노드 파일을하려고하면, 재치가 정상적으로 작동하고 같은 전형적인의 검색어를 검색 :

   [ { _id: 58f3dee3b0346910a69e6e5d, activity: 'running', __v: 0 } ]

내가 테스트를 실행하면,이 MongoError를 얻을 :

The 'cursor' option is required, except for aggregation explain

어떻게 보편적 인 방식으로 모두 상황에서 그하는 일을이 문제를 해결합니까? 가능하면 방법은 약속을 반환 할 내가 좋아하는 것입니다. 나는 체인 집계 방법 (위 참조) 및 파이프 라인에 대한 더 네이티브 몽고 집계 배열,하지만 모두 반환 오류를 모두 시도했습니다. 그와 관련이있는 경우 내 몽고 버전은 3.4.2이다.

해결법

  1. ==============================

    1.나는 문제의 유사한 종류를 직면하고 많은 연구 후에 나는 이전 버전의 위 MongoDB를 3.6에서 변화를 깨는과 호환되지 않습니다으로 몽구스의 이전 버전에 의한 것을 것을 발견했다.

    나는 문제의 유사한 종류를 직면하고 많은 연구 후에 나는 이전 버전의 위 MongoDB를 3.6에서 변화를 깨는과 호환되지 않습니다으로 몽구스의 이전 버전에 의한 것을 것을 발견했다.

    나는 하나 몽구스 버전을 업그레이드 나는 위의 몽구스 버전 4.12.2 또는 (mongoose@4.12.2)와 완벽하게 잘 작동 것을 발견했다.

    당신은 다음 명령을 실행하여 몽구스 버전을 업그레이드 할 수 있습니다 :

    npm install mongoose@4.12.2
    
  2. ==============================

    2.마지막으로이 아웃 생각 : 나는 집계 파이프 라인에 커서 호출을 추가하고, 스트림로 번역했다. 약속 I을 유지하기 위해 쿼리 방법을했다 아래로, 데이터 결의가 스트림이 종료되면 있다는 약속을 반환 :

    마지막으로이 아웃 생각 : 나는 집계 파이프 라인에 커서 호출을 추가하고, 스트림로 번역했다. 약속 I을 유지하기 위해 쿼리 방법을했다 아래로, 데이터 결의가 스트림이 종료되면 있다는 약속을 반환 :

    activitySchema.query.getUnused = function() {
        return new Promise((res, rej) => {
            let data = []
            return Activity.aggregate()
                .lookup({
                    from: 'userActivity',
                    localField: '_id',
                    foreignField: 'activity',
                    as: 'matched_docs',
                })
                .match({ matched_docs: { $eq: [] } })
                .sample(1)
                .project({ matched_docs: 0, __v: 0 })
                .cursor({})
                .exec()
                .on('data', doc => data.push(doc))
                .on('end', () => res(data))
    
        })
    }
    
  3. from https://stackoverflow.com/questions/43442588/mongoose-aggregation-query-fails-in-jest-mockgoose-test-works-elsewhere by cc-by-sa and MIT license