2013-10-30 8 views
0

Node/Express/MongoDB/Mongoskin을 사용하여 앱을 작성하고 있습니다.MongoDB 쿼리 기준 및 예측

나는 데이터베이스에 "클라이언트"라는 이름의 컬렉션이 있는데 여기에는 클라이언트 계정에 대한 정보가 들어있는 문서가 있습니다. 각 클라이언트 문서는 다음과 같이 송장 객체를 포함하는 배열을 포함

doc.invoices = [ 
    {year: 2012, 
    quarter: 1, 
    daily: 912.00, 
    sms: 42.00, 
    paid: true}, 

    {year: 2012, 
    quarter: 2, 
    daily: 913.00, 
    sms: 55.00, 
    paid: true}, 

    {year: 2012, 
    quarter: 3, 
    daily: 876.00, 
    sms: 82.00, 
    paid: true}, 

    {year: 2012, 
    quarter: 4, 
    daily: 903.00, 
    sms: 93.00, 
    paid: false}, 

    {year: 2013, 
    quarter: 1, 
    daily: 915.00, 
    sms: 67.00, 
    paid: true}, 

    {year: 2013, 
    quarter: 2, 
    daily: 920.00, 
    sms: 35.00, 
    paid: true}, 

    {year: 2013, 
    quarter: 3, 
    daily: 880.00, 
    sms: 92.00, 
    paid: true}, 

    {year: 2013, 
    quarter: 4, 
    daily: 900.00, 
    sms: 85.00, 
    paid: false} 
] 

질문 : 내가 모든 클라이언트를 보여주는 최고 관리자 뷰처럼,이 컬렉션에서 모든 문서를 조회 할 말할 수 있습니다,하지만 난 송장 배열에서 반환 된 정보를 "year"가 특정 값 (예 : 2013, 올해)과 같은 개체로 제한하려고합니다. 나는 예측을 추측

내가 필요하지만 문제는 내가 이해하면 투사는 발견 한 첫 번째 결과 ...

+1

'$ unwind' 연산자로'find' 대신'aggregate'를 사용하십시오. – JohnnyHK

+0

당신의 쿼리는 어떻게 생겼습니까? –

답변

5

첫 번째 결과는 mongo에게 무엇을 반환 할 것인지를 알려주는 첫 번째 결과를 반환하지 않습니다.

.findOne (쿼리)은 LIMIT 결과를 하나 또는 find (쿼리) .limit (1)도 동일하게 수행합니다.

데이터를 "모두 얻으려고"한다고 말합니다. 표준 찾기 유형의 쿼리가 시작됩니다

...

find({mongo:query},{mongo:projection}) 

하지만 몽고 쉘 *

당신이 사용할 수 있습니다 당신은 express.js를 이용하여 상기 이후에서 커서 한계 결과를 자바 스크립트 함수 먼저 함수에 경로를 설정하여 ...이 같은

db.sales.find({"year":2013},{_id:0,"year":1,"quarter":1,"daily":1,"sms":1,"paid":1}) 

을 간단한 발견의 결과 "모두 반환"에

app.get('/sales/yr/:yr', sales.getAllResults); 

다음 간단한 몽고 쿼리 및 투영을 처리하는 함수입니다.

/** 
* get ALL results given YEAR ONLY 
* extend jsonQuery to modify results 
* extend or reduce jsonProjection to control data returned 
*/ 
exports.getAllResults= function(req, res) { 
    var yr = req.params.yr ;  
    var jsonQuery = {"year":yr} ; //add or remove comma seperated "key":values given your JSON collection 
    var jsonProjection = {_id:0,"year":1,"quarter":1,"daily":1,"sms":1,"paid":1} ; //leave year out since that's specified in the query anyhow 
    var jsort = {"some-thing-else":-1} ; //-1 descending or 1 ascending 
    db.collection("YOUR-COLLECTION_NAME", function(err, collection) { 
     collection.find(jsonQuery, jsonProjection).sort(jsort).toArray(function(err, items) { 
      res.send(items); 
     }); 
    }); 
} 

마침내 당신은 내가 볼 크리스 Coenraets에서 훌륭한 스타터에 따라 함께이 대답을 넣어 표현에 대한 튜토리얼을 따라하고 싶은 좋은 사람이 있습니다 몽고 수 있습니다 -

http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/

  • 표준 mongo 쿼리 셸을 사용하면 기본적으로 페이징 된 결과 집합으로 제한됩니다. "it"를 입력하면 결과가 반복됩니다.
0

확실하지를 반환하는 것입니다 : 이것은 당신을 반환

find({year:2013},function(err,clients){}) 

: 올해 2013 년에 해당하는 모든 클라이언트는, 그것은 당신에게

는 쿼리에 의해 반환 된 필드를 제한하는 데 사용됩니다에 대해 얘기하고 투사가, 내 말 모든 문서 필드를 반환 "{: 지불 한 1 : 1 년}"개체 프로젝터 인 올해는 2013 년과 각 개체 2 개 (지불 년) 필드

를 얻을 곳이 당신에게 객체의 배열을 반환

.

db.clients.aggregate([ 
    { $unwind: "$invoices" }, 
    { $match: { "invoices.year": 2013 } }, 
    { $group: { _id: "$_id", /* other client fields */, invoices: { $push: "$invoices" } } } 
]); 

에서-먼저 클라이언트 필드를 기준으로 배열에 일치하는 송장을 한 후, 초기 invoices 배열을 긴장 지정된 연도 및 그룹 만 송장을 계속 : @JohnnyK 그의 주석에서 언급 한 바와 같이

1

투영을 사용하면 MongoDB 검색어에 입력란을 명시 적으로 포함하거나 제외 할 수 있습니다. 1을 사용하여 필드를 포함시키고 자 함을 나타 내기 위해 0을 사용합니다.

  • _id 필드가 우리가 명시 적으로

또한 그들을 포함 할 때까지 우리가 '이후 우리가 명시 적으로,

  • 다른 필드
  • 은 제외을 제외하지 않는 한, 기본적으로 포함됩니다 - _id 필드가 특별한 기억 javascript에서 일하면서 mongo 셸에서 수행하는 것과 매우 유사한 방식으로 프로젝트 문서와 문서를 콜렉션에 삽입 할 수 있습니다. 차이점은 드라이버가 MongoDB과 상호 작용하는 데 사용하는 클래스 및 메서드 집합을 제공하고 mongo 셸이 자체 API를 제공한다는 것입니다.

    w.r. 티. CRUDMongoDB 3.2 현재 드라이버와 mongo 쉘은 동일한 사양을 준수합니다. 이 메소드에 액세스하는 방법과 구현 방법은 물론 mongo 쉘에서 다릅니다.

     
    
    
    var MongoClient = require('mongodb').MongoClient, 
        assert = require('assert'); 
    
    
    MongoClient.connect('mongodb://localhost:27017/crunchbase', function(err, db) { 
    
        assert.equal(err, null); 
        console.log("Successfully connected to MongoDB."); 
    
        var query = {"category_code": "biotech"}; 
        var projection = {"name": 1, "category_code": 1, "_id": 0}; 
    
        var cursor = db.collection('companies').find(query); 
        cursor.project(projection); 
    
        cursor.forEach(
         function(doc) { 
          console.log(doc.name + " is a " + doc.category_code + " company."); 
          console.log(doc); 
         }, 
         function(err) { 
          assert.equal(err, null); 
          return db.close(); 
         } 
        ); 
    
    }); 
    
     
    

    node.js 드라이버에서 현재 가장 좋은 방법은, 체인 우리 cursorcursor.project 위에 project를 호출합니다. 이 프로젝트 호출은 쿼리에 대한 필드 투영을 설정합니다. 이 호출은 foreach 메서드와 마찬가지로 데이터베이스에서 문서를 검색하도록 요청하지 않습니다. 오히려 우리의 cursor에 의해 유지되는 쿼리 표현에 몇 가지 추가 세부 사항을 추가합니다. 많은 커서 메소드가 있습니다. MongoDB 데이터베이스에 대해 실행하려는 작업을 완벽하게 표현하기 위해 함께 연결할 수 있습니다. db.collection에 대한 호출은 동기식입니다. 커서의 project 메소드를 사용하여 여기 projection 필드로 해당 cursor을 수정합니다.