2017-03-12 1 views
0

배열의 하위 문서를 가져오고 필터링하려고합니다. 항상mongoose 4.7.5 : 배열에 하위 문서를 가져 오는 방법

Model.findById(id) 
    .select('stats') 
    .where('stats.createdAt').gt(data-value).lt(data-value) 

그러나 결과 :

{ 
    "_id": { 
     "$oid": "58bc4fa0fd85f439ee3ce716" 
    }, 
    "updatedAt": { 
     "$date": "2017-03-08T20:39:19.390Z" 
    }, 
    "createdAt": { 
     "$date": "2017-03-05T17:49:20.455Z" 
    }, 
    "app": { 
     "$oid": "58ae10852035431d5a746cbd" 
    }, 
    "stats": [ 
     { 
      "meta": { 
       "key": "value", 
       "key": "value" 
      }, 
      "_id": { 
       "$oid": "58bc4fc4fd85f439ee3ce718" 
      }, 
      "data": "data", 
      "updatedAt": { 
       "$date": "2017-03-05T17:49:56.305Z" 
      }, 
      "createdAt": { 
       "$date": "2017-03-05T17:49:56.305Z" 
      } 
     }, 
     { 
      "meta": { 
       "key": "value", 
       "key": "value" 
      }, 
      "_id": { 
       "$oid": "58c06bf79eaf1f15aafe39d0" 
      }, 
      "data": "data", 
      "updatedAt": { 
       "$date": "2017-03-08T20:39:19.391Z" 
      }, 
      "createdAt": { 
       "$date": "2017-03-08T20:39:19.391Z" 
      } 
     } 
    ] 
} 

는 내가 뭘 얻고 싶은 것은 두 날짜 사이의 통계 배열의 하위 문서 내가 몽구스 쿼리 체인을 시도입니다 :

문서는이 구조를 가지고 모든 하위 문서를 포함한 전체 문서

은 또한이 같은 집계 시도 :

Model.aggregate({ 
    $match: { 
     'stats.createdAt': '2017-03-05T17:49:56.305Z' 
    } 
    }) 

결과는 항상 '2017-03-05T17:49:56.305Z'String 때문에 귀하의 결과가 null null

답변

0

입니다, 당신은 Date를 찾고 있습니다 : new Date('2017-03-05T17:49:56.305Z')

당신 날짜 범위가 $unwind$match 인 하위 문서를 필터링 할 수 있습니다.

,451,515,
var startDate = new Date('2017-03-05T17:49:56.305Z'); 
var endDate = new Date('2017-03-08T17:49:56.305Z'); 

Model.aggregate([{ 
    $match: { 
     "_id": new mongoose.mongo.ObjectId("58bc4fa0fd85f439ee3ce716"), 
     "stats.createdAt": { 
      $gte: startDate, 
      $lt: endDate 
     } 
    } 
}, { 
    $unwind: "$stats" 
}, { 
    $match: { 
     "stats.createdAt": { 
      $gte: startDate, 
      $lt: endDate 
     } 
    } 
}], function(err, res) { 
    console.log(res); 
}) 

또는 $filter 더 간단 :

Model.aggregate([{ 
    $match: { 
     "_id": new mongoose.mongo.ObjectId("58bc4fa0fd85f439ee3ce716"), 
     "stats.createdAt": { 
      $gte: startDate, 
      $lt: endDate 
     } 
    } 
}, { 
    $project: { 
     "stats": { 
      $filter: { 
       input: "$stats", 
       as: "stat", 
       cond: { 
        $and: [ 
         { $gte: ["$$stat.createdAt", startDate] }, 
         { $lte: ["$$stat.createdAt", endDate)] } 
        ] 
       } 
      } 
     } 
    } 
}], function(err, res) { 
    console.log(res); 
}) 
+0

안녕! 이벤트 예제의 데이터가 DB에 존재하지만 솔루션의 결과가 빈 배열 [] – user3462064

+0

일 수 있습니다. 아마도 'ObjectId' 유형으로 인해 내 게시물을 업데이트했습니다. –

관련 문제