javascript - mongodriver - nodejs mongodb document



Node.js mongodb 드라이버 비동기/쿼리 대기 중 (6)

mongoose find async / await를 사용하여 쿼리 찾기

async / await의 경우에는 mongoose.connect 를 사용하지 말라.

    var router = require("express").Router()
    var mongoose = require("mongoose")
var await = require("await")
var async = require("async")

    var mongoUrl = "mongodb://localhost:27017/ekaushalnsdc"

    router.get("/async/await/find",async(req, res,  next) => {
      try {
        var db =  await mongoose.createConnection(mongoUrl)
          var colName = db.collection('collectionName')
        var result  = await colName.find({}).toArray()
        res.json(result)
    }catch(ex) {
       res.json(ex.message)
    }
    })

mongodb 네이티브 드라이버를 사용하는 node.js 응용 프로그램이 있습니다. 애플리케이션 코드를 노드 v8.9.1을 사용하여 async / await으로 마이그레이션하는 과정에서 mongodb 쿼리를위한 우아한 방법을 찾기 위해 애를 먹고 있습니다. mongodb 드라이버의 주요 문제점은 모든 쿼리가 약속 기능이 비동기 메소드에 필수 사항 인 콜백을 사용한다는 것입니다.

대안 :

  • mongoose - 쿼리가 더 이상 사용되지 않을 것이라고 약속하고, 내 응용 프로그램에 약간의 오버 헤드가있는 스키마 모델을 사용하도록합니다.
  • mongoist - 비동기 적으로 구축 되었기 때문에 마음에 듭니다 .하지만 mongodb에 대한 SSL 연결 및 잘못된 문서화로 인한 오류로 인해이 솔루션에서 멀어졌습니다.

우아한 방법으로 구현하는 데 성공한 유일한 해결책은 mongodb 드라이버 API를 완전히 약속하기 위해 callback-promise npm 패키지를 사용하는 것입니다.

우아한 고성능 방법을위한 새로운 아이디어?


Answer #1

(Pax Beach의 답변에 따르면, 그것은 downvoted되었고, 어떤 상황에서 Pat의 대답이 가장 좋은 이유를 설명하는 코멘트를 추가하고 싶었습니다. 코멘트를 추가 할 담당자가 없습니다.)

일반적인 경우 toArray ()를 사용한 응답이면 충분합니다.

그러나 거대한 문서 모음이 포함될 때 toArray ()를 사용하면 사용 가능한 RAM을 초과하게됩니다. 따라서 이러한 상황에서 "고성능"솔루션은 toArray ()를 사용하면 안됩니다.

이 경우에는 MongoDB 스트림을 사용할 수 있지만 스트림을 사용하는 것보다 훨씬 간단합니다.

const cursor = db.collection('someCollection').find({})
for (let doc = await cursor.next(); doc; doc = await cursor.next()) {
    // Process the document.
}

Answer #2

u가 콜백을 전달하지 않으면 mongodb 클라이언트가 약속을 반환합니다.

공식 MongoDB Node.js 드라이버는 MongoDB와의 약속 기반 상호 작용뿐만 아니라 콜백 기반을 제공하여 응용 프로그램이 ES6의 새로운 기능을 최대한 활용할 수있게합니다

공식 문서에서


Answer #3

감사. ES6에서 잘 작동합니다.

const middleWare = require('middleWare');
const MONGO = require('mongodb').MongoClient;

router.get('/', middleWare(async (req, res, next) => {
    const db = await MONGO.connect(url);
    const MyCollection = db.collection('MyCollection');
    const result = await MyCollection.find(query).toArray();
    res.send(result);
}))

Answer #4

편집 : 'mongodb'v3.x

mongoDB ES6 미래 에 따르면이 방법을 사용할 수 있습니다.

let MongoClient = require('mongodb').MongoClient;
const connectionString = 'mongodb://localhost:27017';

    (async () => {
        let client = await MongoClient.connect(connectionString,
            { useNewUrlParser: true });

        let db = client.db('dbName');
        try {
           const res = await db.collection("collectionName").updateOne({ 
               "someKey": someValue
           }, { $set: someObj }, { upsert: true });

           console.log(`res => ${JSON.stringify(res)}`);
        }
        finally {
            client.close();
        }
    })()
        .catch(err => console.error(err));

Answer #5

Ido Lev의 대답 에 대해서는 언급 할 수 없기 때문에 답변으로 게시하고 있습니다. 나는 내가 명성 50에 도달하자마자 이걸 옮길 것이다.

db 연결을 닫는 것을 잊지 마십시오. 그렇지 않으면 열려있는 연결이 너무 많아서 응용 프로그램이 db에 연결할 수 없습니다 (일주일 전에 저에게 일어난 일입니다).

쿼리가 성공하거나 실패 할 수 있으므로 finally 블록에서 연결을 닫는 것이 좋습니다.

const db = await MongoClient.connect(url);
try {
    const stuff = await db.collection("Stuff").find({});
    // Do something with the result of the query
} finally {
    db.close();
}

업데이트 : 이것은 또한 내 문제를 해결하지 못하는 것 같습니다. 어떤 사람들은 수동으로 연결을 닫을 필요조차 없다고 말합니다. 가능한 경우 응용 프로그램에서 연결을 다시 사용하는 것이 가장 좋습니다.





async-await