在下一个日期访问对象中的对象

时间:2018-08-03 12:29:25

标签: javascript node.js mongodb mongoose

我知道之前已经有人问过这个问题,但是我似乎找不到答案,如何在数据事件中访问数据,我想在集合JadwalBooking中显示下一个日期的数据。

架构:

"keterangan" : "keterangan di rubah",
"dataevent" : {
   "time_start" : 60,
   "time_end" : 660,
   "_id" : ObjectId("5b3da607acddef1c24317dd0"),
   "name" : "event 1",
   "description" : "lorem ipsum, lorem ipsum",
"date" : ISODate("2018-11-25T00:00:00.000Z")
 }

查询:

const data = await JadwalBooking.aggregate([
    {
        $match: {
            dataevent: {
                $elemMatch: {
                    date: {
                        $gte: new Date(new moment().format("YYYY-MM-DD")),
                    }
                }
            }
        }
    },
    {
        $project:
        {
            _id: 1,
            dataevent: 1,
            keterangan: 1,
        }
    },
    {
        $sort: { date: 1 }
    }
]);

3 个答案:

答案 0 :(得分:0)

当您要从$elemMatch查询特定的$elemMatch并仅返回匹配的Object时,您无需使用Object来使用array of Objects从数组。

在您的情况下,使用“。”进行简单查询。表示法将起作用。

尝试一下:

const data = await JadwalBooking.aggregate([
    {
        $match: {
            dataevent.date: {
                $gte: new Date(new moment().format("YYYY-MM-DD"))
            }
        }
    },
    {
        $project:
        {
            _id: 1,
            dataevent: 1,
            keterangan: 1,
        }
    },
    {
        $sort: { date: 1 }
    }
]);

答案 1 :(得分:0)

您需要使用点表示法进行查询并按日期排序:

 const data = await JadwalBooking.aggregate([
  {
    $match: {
        "dataevent.date": {
            $gte: new Date(new moment().format("YYYY-MM-DD"))
        }
    }
  },
  {
    $project:
    {
        _id: 1,
        dataevent: 1,
        keterangan: 1,
    }
  },
  {
    $sort: { "dataevent.date": 1 }
  }
 ]);

答案 2 :(得分:0)

aggregation所述,

db.collection
  .find({"dataevent.date" : {$gt : new Date(new moment().format("YYYY-MM-DD"))}})
  .sort({"dataevent.date": 1})

还有一件事:

根据您的架构,您实际上也不需要使用$project。在检索整个数据时。

  

注意:- $elemMatch用于数组,需要使用dot notation

const data = await JadwalBooking.aggregate([
  {
    $match: {
      "dataevent.date": {
        $gte: new Date(new moment().format("YYYY-MM-DD"))
      }
    }
  },
  {
    $sort: { date: 1 }
  }
]);