MongoDB Как узнать записи, которые не находятся в диапазоне дат - PullRequest
0 голосов
/ 18 мая 2018

У меня есть две коллекции, как показано ниже,

Пользовательская коллекция

{
    "_id" : ObjectId("5af2e946aa546125b5de85cc"),
    "name" : "Sudhin",
    "email" : "abc@abc.com",
    "roles" : [ 
        "Reader", 
        "Instructor"
    ],
    "createdAt" : ISODate("2018-05-09T12:27:50.651Z"),
    "updatedAt" : ISODate("2018-05-16T09:22:07.280Z")
},
{
    "_id" : ObjectId("5af2f3a6efb83031faaa3d82"),
    "name" : "Rahul",
    "email" : "abcd@abc.com",
    "roles" : [ 
        "Reader", 
        "Instructor"
    ]
    "createdAt" : ISODate("2018-05-09T13:12:06.518Z"),
    "updatedAt" : ISODate("2018-05-16T09:22:07.281Z")
} 

планировщики Коллекции

{
    "_id" : ObjectId("5afd763b8fad29597e1b85ed"),
    "title" : "ILT Course",
    "type" : "Course",
    "ilt" : {
        "instructorId" : ObjectId("5af2e946aa546125b5de85cc"),
        "type" : "ILT-Offline",
        "instructorName" : "Sudhin",
        "place" : "*******",
        "description" : "******"
    },
    "startDate" : ISODate("2018-05-10T11:00:00.000Z"),
    "endDate" : ISODate("2018-05-15T12:00:00.000Z"),
    "createdAt" : ISODate("2018-05-17T12:31:55.574Z"),
    "updatedAt" : ISODate("2018-05-17T12:31:55.575Z")
}

В коллекции планировщиков «ilt.instructorId» - это referenceId для пользователя.

Коллекция планировщика содержит все детали определенного пользовательского расписания.

startDate - это начальная дата и время определенногографик.endDate - это конечная дата и время определенного расписания.

Когда я передаю startDate в endDate (2018-05-05 00:00 - 2018-05-10 00:00), я хочу получить всепользователи с ролевым инструктором и у которых нет запланированных курсов между этими датами.

Например: если я прохожу 2018-05-05 00:00 - 2018-05-10 00:00, он должен вернуть следующий документ

   {
        "_id" : ObjectId("5af2f3a6efb83031faaa3d82"),
        "name" : "Rahul",
        "email" : "abcd@abc.com",
        "roles" : [ 
            "Reader", 
            "Instructor"
        ]
        "createdAt" : ISODate("2018-05-09T13:12:06.518Z"),
        "updatedAt" : ISODate("2018-05-16T09:22:07.281Z")
    }

Я пробовал нижезапрос

UserModel.query().aggregate([

    { $match: { roles: { $in: ['Instructor'] } } },

    {
        $lookup: {
            from: "schedulers",
            localField: "_id",
            foreignField: "ilt.instructorId",
            as: "schedule"
        }

    },

    {
        $match: {
            "schedule.type": "Course",
            $and: [

                { 'schedule.endDate': { $not: { $lte: new Date("2018-05-12T12:00:00.000Z") } }},
                { 'schedule.startDate': { $not: { $gte: new Date("2018-05-06T11:00:00.000Z") } }},
            ]
        }
    },


    {
        $project: {
            _id: 1,
            name: 1,
            empId: 1,
            startDateTime: "$schedule.startDate",
            endDateTime: "$schedule.endDate",
    }
}])

1 Ответ

0 голосов
/ 18 мая 2018

Пожалуйста, проверьте ниже запрос его помощь вам:

db.getCollection('user').aggregate([

    { $match: { roles: { $in: ['Instructor'] } } },

    {
        $lookup: {
            from: "schedulers",
            localField: "_id",
            foreignField: "ilt.instructorId",
            as: "schedule"
        }

    }, 
    {
        $match: {
            "schedule.type": "Course",
            $or: [
               { 'schedule.startDate': {  $lt: new Date("2018-05-08T11:00:00.000Z")  }},
                { 'schedule.endDate': {  $gt: new Date("2018-05-14T12:00:00.000Z") }},

            ]
        }
    },

    {
        $unwind: {
          path: '$schedule',
          preserveNullAndEmptyArrays: true,
        },
      },


    {
        $project: {
            _id: 1,
            name: 1,
            empId: 1,
            schedule:'$schedule',
            startDateTime: "$schedule.startDate",
            endDateTime: "$schedule.endDate",
    }
}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...