2017-02-06 3 views
0

Как написать запрос для возврата объекта между датами? Запрос должен искать вложенное свойство. Я использую $gte и $lte, но он не работает так, как я ожидал. Я хочу вернуть объект «task», который имеет history.startTime между двумя датами.MongoDB между диапазоном дат запроса - вложенным свойством

db.tasks.find({'history.startTime' : { '$gte': ISODate("2017-02-04T00:00:00.000Z"), '$lt': ISODate("2017-02-05T23:00:00.000Z")} }).pretty() 
    { 
      "_id" : ObjectId("588f53c5d00baa2558fd56ae"), 
      "desc" : "test3", 
      "category" : "Category1", 
      "project" : "Project1", 
      "_creator" : "582afb3800c1bc1f203edf39", 
      "history" : [ 
        { 
          "startTime" : ISODate("2017-02-06T11:49:42.570Z"), 
          "stopTime" : ISODate("2017-02-06T11:49:45.725Z"), 
          "_id" : ObjectId("589862d9449b4629f8dbaba7"), 
          "dt" : 3.155 
        }, 
        { 
          "startTime" : ISODate("2017-02-06T08:53:53.086Z"), 
          "stopTime" : ISODate("2017-02-06T11:47:58.098Z"), 
          "_id" : ObjectId("5898626e449b4629f8dbaba6"), 
          "dt" : 10445.012 
        }, 
        { 
          "startTime" : ISODate("2017-01-30T15:30:46.287Z"), 
          "stopTime" : ISODate("2017-01-30T15:32:52.979Z"), 
          "_id" : ObjectId("588f5c2cd00baa2558fd56b0"), 
          "dt" : 126.692 
        }, 
        { 
          "startTime" : ISODate("2017-01-30T13:55:09.738Z"), 
          "stopTime" : ISODate("2017-01-30T14:55:13.974Z"), 
          "_id" : ObjectId("588f53d1d00baa2558fd56af"), 
          "dt" : 3604.236 
        } 
      ], 
      "isCompleted" : false, 
      "isPerforming" : false, 
      "duration" : 14179.095000000001, 
      "updated" : ISODate("2017-02-06T11:49:45.725Z"), 
      "creationDate" : ISODate("2017-01-30T14:55:01.045Z"), 
      "__v" : 4 
    } 
+0

Невозможно. Только вы можете сделать это вручную или использовать общий запрос через $ unwind. –

ответ

2

Это массив. Ваш запрос не будет работать. Вы должны использовать $ elemMatch.

db.tasks.find({ 
    'history': { 
     $elemMatch: { 
      startTime: { 
       $gte: ISODate("2017-02-04T00:00:00.000Z"), 
       $lte: ISODate("2017-02-05T23:00:00.000Z") 
      } 
     } 
    } 
});