2017-02-06 4 views
0

У меня есть коллекция модель с ниже схеме:Вложенный массив соответствия дата не работает в Монго

{ 
     "id":"122HSHDJS2333222222", 
     "name":"Item1", 
     "image":"", 
     "is_deleted":false, 
     "item_blocked_on":[ 
      { 
       "start_date":"2017-02-15T18:30:00.000Z", 
       "end_date":"2017-02-24T18:30:00.000Z" 
      }, 
      { 
       "start_date":"2017-01-16T18:30:00.000Z", 
       "end_date":"2017-01-26T18:30:00.000Z" 
      }, 
     ] 
    } 

Выше модель представляет, что эти «элементы» заблокированы, для их запуска до конца даты, следовательно, не доступны для отображения

Теперь в моем случае USER отправит «from_date» и «end_date» с клиентской стороны. Что я хочу, запрос должен возвращать «элементы», которые «доступны» для отображения для даты начала и окончания работы пользователя.

Мой запрос, который возвращает неверный ответ: -

{ 
     where:{ 
      and:[ 
       { 
        and:[ 
         { 
          or:[{"item_blocked_on.start_date": {"gt": new Date(from_date)}},{"item_blocked_on.end_date": {"lt": new Date(from_date)}}], 
         }, 
         { 
          or:[{"item_blocked_on.start_date": {"gt": new Date(end_date)}},{"item_blocked_on.end_date": {"lt": new Date(end_date)}}], 
         } 
        ] 
       }, 
       { 
        "is_deleted":false 
       } 

      ] 
     } 
    }; 

Пожалуйста, дайте мне знать, если я не быть ясно, или делать что-то неправильно.

Благодаря

ответ

0

согласно вашему требованию вы можете легко использовать $ elemMatch, как показано в примере.

 router.post('/data_find', function (req, res) { 
      var database = req.Collection; 
      var start_date = req.body.start_date; 
      var end_date = req.body.end_date; 
      if (start_date.length > 0 && end_date.length > 0) { 
database.find({ "item_blocked_on.start_date": {$gte: start_date}, "item_blocked_on.end_date": {$lt: end_date},function(err,user){ 
        if (err) { 
         res.json({status: 0, message: err}); 
        } 
        if (!user) { 
         res.json({status: 0, msg: "not found"}); 
        } 
        res.json({status: 1, id: user._id, message: " success"}); 
       }) 
      } else { 
       res.json({status: 0, msg: "Invalid Fields"}); 
      } 
     }); 

надеюсь, что это помогает

+0

Спасибо за ответ, я думаю, что ваши требования неверны. «Элементы», которые зарезервированы для «диапазона дат», не должны появляться на выходе, не могут использовать '$ eq', поскольку время может отличаться. – BeingExpert

+0

Ваш вопрос правильный, этот запрос работает для вас. database.find ({"item_blocked_on.start_date": {$ gte: start_date}, "item_blocked_on.end_date": {$ lt; end_date}}; также обновлен код –

0

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

Нечто подобное.

db.collection.find({ "item_blocked_on": { $elemMatch: { start_date: { $gt: somedate, $lt: somedate }, end_date: { $gt: somedate, $lt: somedate }} } }) 
Смежные вопросы