2014-11-22 2 views
2

이 질문은 여기에서 보았습니다. 그러나 나에게 아무런 답변도 없었습니다.Node/Mongo가 ObjectId로 찾을 수 없습니다.

내 코드 : 나는 ObjectId가 직접 확인하는 다섯 가지 방법을 시도하고도 문제가 해결되지 않은

var BSON = require('mongodb').BSONPure; 

// value is 544d644cf6eea12336f5e0a1 
var object_id = BSON.ObjectID.createFromHexString(req.params.id); 
        } 
// Create GET _id query 
collection.find(object_id).toArray(
    function (err, data) { 
    if (!err) { 
     // 200 OK 
     return res.status(200).send({success: true, code: 200, count: data.length, results: data}); 
    } else { 
     // 500 Internal Server (Mongodb) 
     console.log(err); 
     return res.status(500).send({success: false, code: 500, error: "Internal Server Error"}); 
    } 

. 위의 것은 최근 시도입니다. 노드에서 결과를 얻지 못했습니다. 몽고 껍질 안에 내가 할 때 :

> db.people.find({_id : ObjectId("544d644cf6eea12336f5e0a1")}); 
{ "_id" : ObjectId("544d644cf6eea12336f5e0a1"), "name" : "Jim", "age" : 24, "job" : "engineer" } 

나는 알 수있다. 내가 여기서 무엇을 놓치고 있니?

답변

7

mongo 셸과 동일하므로 find()에 대한 쿼리 개체를 작성해야합니다. 또한 find()에 대한 관련 문서를 검토 할 수 있습니다

var mongodb = require('mongodb'); 
var MongoClient = mongodb.MongoClient; 
var ObjectId = mongodb.ObjectID; 

MongoClient.connect('mongodb://localhost:27017/test', function(err, db) { 
    db.collection('people', function(err, collection) { 
    collection.find({_id: new ObjectId('544d644cf6eea12336f5e0a1')}).toArray(function(err, docs) { 
     console.log(docs); 
     db.close(); 
    }); 
    }); 
}); 

ObjectID

3

당신이 MongoDB의 쉘과 node.js.에서 컬렉션을 쿼리있는 방법을 비교 다음은 예입니다 MongoDB의에서

는 쿼리에 보이는 쉘
{_id : ObjectId("544d644cf6eea12336f5e0a1")} 

좋아하지만 Node.js를에 그것은 그냥

ObjectId("544d644cf6eea12336f5e0a1") 

, 다음 코드를 시도해보십시오 :

var ObjectID = require('mongodb').ObjectID; 
// ... 
collection.find({_id : ObjectId("544d644cf6eea12336f5e0a1")}).toArray(function (err, data) { 
    // data[0] is your document here 
} 

당신은 문제가있는 경우를 node-mongodb-native을 사용하는 대신 mongojs을 시도하십시오. node-mongodb-native을 기반으로하며 가능한 한 MongoDB 셸을 에뮬레이트하도록 설계되었습니다.

+0

그래, 나도이 방법을 시도했다. 나는 몽고에서 갈 수있는 생각이 무엇이든 절망적으로 던지고있다. 나는 당신의 방법을 시도했지만 여전히 결과가 없습니다. 이 답변의 가능한 모든 순열을 테스트 한 후에 모든 답변에 공식 응답을 게시하겠습니다. –

1
collection.find({_id: object_d}).toArray(...) 
0

나는 모든 대답을 upvoted. 저의 원래 질문의 맥락에서 귀하의 모든 대답이 정확했습니다. 도와 주셔서 감사합니다! 이 문제는 완전히 다른 것이 었습니다. 지루해지기를 원하지 않는 한, 당신을 지루하게하지 않을 것입니다 ...

글쎄, 좋아. 내 응용 프로그램은 Mongo 컬렉션에서 동적으로 경로를 만듭니다. 익명 함수를 호출이 자기가 묶이없는 경우

for (var route in collections) { 
       (function() { 
        // Set vars 
        var collection = db.collection(collections[route]); 
        // Create Express GET route 
        app.get('/' + collections[route] + '/:id', function (req, res) { 
         // Return 400 Bad Request error if no params provided 
         if (typeof req.params.id == 'undefined') { 
          return res.status(400).send({ 
           success: false, 
           code: 400, 
           error: "No _id parameter provided" 
          }); 
         } 

         // Create GET _id query 
         collection.find({_id: new ObjectId(req.params.id)}).toArray(function (err, data) { 
          if (!err) { 
           // 200 OK 
           return res.status(200).send({ 
            success: true, 
            code: 200, 
            count: data.length, 
            results: data[0] 
           }); 
          } else { 
           // 500 Internal Server (Mongodb) Error 
           console.log(err); 
           return res.status(500).send({ 
            success: false, 
            code: 500, 
            error: "Internal Server Error" 
           }); 
          } 
         }); 
        }); 
    } 
} 

: 경로의 목록을 반복 실제로 작동하는 것을 루프 위해서는, 경로 생성 논리를 둘러싸는 자기 호출 기능, 예를 들어이 있어야합니다 논리, 라우터는 collection [route]의 마지막 값이 무엇이든간에 사용합니다. 따라서/accounts/: id에 대한 호출은 요청을 처리합니다 (경로가 존재하기 때문에). 그러나 실제로는 Mongo의 사람들 콜렉션을 가리 킵니다 그 값은 배열의 마지막 값이기 때문에 (루프가 처음 실행될 때 강제로 계산되지 않았기 때문에). 이 설명이 의미가 있기를 바랍니다. 어쨌든, (function() {})();

+1

나는 더 멀리 가서 코드를 평평하게하고 더 좋은 모듈성을 얻기 위해 라우트 핸들러 함수를 완전히 추출 할 것이다. – Zlatko

+0

예. 곧 리팩토링이 시작됩니다. :) –

관련 문제