Соответствие Mongodb с несколькими условиями не работает

#mongodb #nosql #aggregation-framework

#mongodb #nosql #агрегация-фреймворк

Вопрос:

У меня есть user коллекция, содержащая такие данные

 {
    "_id" : ObjectId("5da594c15324fec81d000027"),
    "password" : "******",
    "activation" : "Active",
    "userType" : "Author",
    "email" : "something@gmail.com",
    "name" : "Something",
    "profilePicture" : "profile_pictures/5da594c15324fec81d0000271607094354423image.png",
    "__v" : 0
}
 

С другой стороны userlog , есть такие данные

 {
    "_id" : ObjectId("5fcb7bb4485c34a41900002b"),
    "duration" : 2.54,
    "page" : 1,
    "activityDetails" : "Viewed Page for seconds",
    "contentType" : "article",
    "activityType" : "articlePageStayTime",
    "bookId" : ObjectId("5f93e2cc74153f8c1800003f"),
    "ipAddress" : "::1",
    "creator" : ObjectId("5da594c15324fec81d000027"),
    "created" : ISODate("2020-12-05T12:23:16.867Z"),
    "__v" : 0
}
 

Мне нужны данные, как показано ниже

 {
    "_id" : ObjectId("5da594c15324fec81d000027"),
    "password" : "******",
    "activation" : "Active",
    "userType" : "Author",
    "email" : "something@gmail.com",
    "name" : "Something",
    "profilePicture" : "profile_pictures/5da594c15324fec81d0000271607094354423image.png",
    "userlogs":
    [{
    "_id" : ObjectId("5fcb7bb4485c34a41900002b"),
    "duration" : 2.54,
    "page" : 1,
    "activityDetails" : "Viewed Page for seconds",
    "contentType" : "article",
    "activityType" : "articlePageStayTime",
    "bookId" : ObjectId("5f93e2cc74153f8c1800003f"),
    "ipAddress" : "::1",
    "creator" : ObjectId("5da594c15324fec81d000027"),
    "created" : ISODate("2020-12-05T12:23:16.867Z"),
    "__v" : 0
    }]
 

}

Я пытаюсь найти всех пользователей, кроме администратора, с их журналом за каждый месяц. Итак, мое условие — пользователь не будет администратором, а дата будет находиться между двумя диапазонами. Но это не работает. Ниже приведен мой текущий код, который возвращает пустой набор данных-

 User
    .aggregate([
    {
        $match: {
            userType: {
                $ne:"admin"
            }           

        },
        "$and": [
                {
                    "userlogs.created": {
                        $lte: dateCompare.end
                    }
                },
                {
                    "userlogs.created": {
                        $gte: dateCompare.start
                    }
                }

            ]   
    },
    {
        $lookup:{
            from: "userlogs", //or Races.collection.name
            localField: "_id",
            foreignField: "creator",
            as: "userlogs"
        },
        
    },
    

    ]
 

Я использую mongodb версии 3.2

Ответ №1:

Попробуйте это

 User.aggregate([
    {
        $match: {
            userType: {
                $ne:"admin"
            }           

        },
    {
        $graphLookup:{
            from: "userlogs", //or Races.collection.name
            startWith: "$_id",
            connectToField:"creator",
            connectFromField:"_id", 
            maxDepth:0,
            as: "userlogs",
            restrictSearchWithMatch:{created:{
                 $lte:dateCompare.end,
                 $gte:dateCompare.start
                  }} 

        },
        
    }   ]

 

Комментарии:

1. Спасибо. Он возвращает набор данных. Но диапазон дат не работает. Возвращаются все данные.

2. Спасибо. Сейчас это работает. Unwind просто создает экземпляры для каждого элемента userlogs. Но почему это должно решить проблему с диапазоном дат? Хотите объяснить?

3. В любом случае я написал для вас что-то более быстрое. Проверьте это сейчас @HassanNomani. Вы получите массив документов с желаемыми условиями.