2017-03-12 11 views
0

配列内のサブ文書をフェッチしてフィルタリングしようとしています。mongoose 4.7.5:サブ文書を配列にフェッチする方法

文書は、この構造を有する:

{ 
    "_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.findById(id) 
    .select('stats') 
    .where('stats.createdAt').gt(data-value).lt(data-value) 

しかし、常に結果すべてのサブ文書を含む完全な文書。

はまた、私は、このような凝集を試してみました:

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

'2017-03-05T17:49:56.305Z'Stringであるため、結果は常にnull

答えて

0

あなたの結果がnullされ、あなたがDateを探しています:new Date('2017-03-05T17:49:56.305Z')

あなたは日付範囲が$unwindおよび$matchのサブ文書をフィルタリングできます。

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); 
}) 

以上に簡単:

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にありますが、ソリューションの結果は空ですarray [] – user3462064

+0

おそらく 'ObjectId'型のため、投稿を更新しました –

関連する問題