Как запросить документы встроенных документов в mongodb на основании даты метки времени? - PullRequest
1 голос
/ 21 января 2020

У меня есть сценарий использования, в котором мне нужно найти документы, созданные в определенный день. Вот мои примеры данных.


{
    "_id" : ObjectId("5bc1ddf6e2e30c3664e0436e"),
    "status" : true,
    "users" : [ 
        {
            "_id" : ObjectId("5c4965e97a50394e4cdc8671"),
            "email" : "aaaa@gmail.com",
            "status" : true,
            "test" : [ 
                {
                    "_id" : ObjectId("5c4965e97a90394e4cdc8671"),
                    "updatedAt" : ISODate("2019-10-30T07:14:49.281Z"),
                    "createdAt" : ISODate("2019-10-30T07:14:49.281Z"),
                    "name" : "karthik",
                    "status" : true
                }, 
                {
                    "_id" : ObjectId("5c4875e97a90394e4cdc8671"),
                    "updatedAt" : ISODate("2019-10-31T07:14:49.281Z"),
                    "createdAt" : ISODate("2019-10-31T07:14:49.281Z"),
                    "name" : "suresh",
                    "status" : true
                }
            ]
        }, 
        {
            "_id" : ObjectId("5c4965e97a50394e4cdc8671"),
            "email" : "bbbb@gmail.com",
            "status" : true,
            "test" : [ 
                {
                    "_id" : ObjectId("5c4965e97a90844e4cdc8671"),
                    "updatedAt" : ISODate("2019-09-30T07:14:49.281Z"),
                    "createdAt" : ISODate("2019-09-30T07:14:49.281Z"),
                    "name" : "ramesh",
                    "status" : true
                }, 
                {
                    "_id" : ObjectId("5c4875e97a90394e4cdc8671"),
                    "updatedAt" : ISODate("2019-10-05T07:14:49.281Z"),
                    "createdAt" : ISODate("2019-10-05T07:14:49.281Z"),
                    "name" : "jayesh",
                    "status" : true
                }
            ]
        }
    ]
}
,
{
    "_id" : ObjectId("5bc1ddf6e2e30c3664e0566e"),
    "status" : true,
    "users" : [ 
        {
            "_id" : ObjectId("5c4965e97a50394e4cdc8771"),
            "email" : "cccc@gmail.com",
            "status" : true,
            "test" : [ 
                {
                    "_id" : ObjectId("5c4965e97a90844e4cdc5412"),
                    "updatedAt" : ISODate("2019-10-14T07:14:49.281Z"),
                    "createdAt" : ISODate("2019-10-14T07:14:49.281Z"),
                    "name" : "sai",
                    "status" : true
                }, 
                {
                    "_id" : ObjectId("5c4875e97a90394e4cdc8671"),
                    "updatedAt" : ISODate("2019-10-05T07:14:49.281Z"),
                    "createdAt" : ISODate("2019-10-05T07:14:49.281Z"),
                    "name" : "mahesh",
                    "status" : true
                }
            ]
        }, 
        {
            "_id" : ObjectId("5c4965e97a50394e4cdc9871"),
            "email" : "dddd@gmail.com",
            "status" : true
        }
    ]
}
,
{
    "_id" : ObjectId("5bc1ddf6e2e30c3664e0966e"),
    "status" : true,
    "users" : [ 
        {
            "_id" : ObjectId("5c4965e97a50394e4cdc8687"),
            "email" : "eeee@gmail.com",
            "status" : true
        }, 
        {
            "_id" : ObjectId("5c4965e97a50394e4cdc8664"),
            "email" : "ffff@gmail.com",
            "status" : true
        }
    ]
}

Теперь мне нужно получить users, данные которого вставлены в 30th date of createdAt (only day value, not month)

Мой ожидаемый результат будет,

"users":[
    {
        "name":"karthik"
    },
    {
        "name":"ramesh"
    }
]

Как добиться такого рода ответа и можно ли фильтровать документы только по дневным значениям, а не по полным временным меткам?

1 Ответ

1 голос
/ 21 января 2020

Вы можете использовать $ unwind с $ replace Root для продвижения ваших вложенных документов до уровня root, а затем использовать оператор $ dayOfMonth для применения Ваше условие фильтрации:

db.collection.aggregate([
    {
        $unwind: "$users"
    },
    {
        $unwind: "$users.test"
    },
    {
        $replaceRoot: { newRoot: "$users.test" }
    },
    {
        $match: {
            $expr: {
                $eq: [ { $dayOfMonth: "$createdAt" }, 30 ]
            }
        }
    },
    {
        $project: {
            _id: 0,
            name: 1
        }
    }
])

Пн go Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...