Как использовать запрос mongodb для сравнения элемента в БД с другим элементом в массиве, хранящемся в той же коллекции - PullRequest
0 голосов
/ 09 октября 2019

Вот мой вопрос.

Это мои примеры записей

{
    "_id" : ObjectId("5d9b69fae4757402b4b4ca0d"), 
    "status_changed_utc" : [
        {
            "status" : NumberInt(1), 
            "time" : ISODate("2019-05-20T23:03:10.000+0000")
        }, 
        {
            "status" : NumberInt(2), 
            "time" : ISODate("2019-05-23T23:04:03.000+0000")
        }, 
        {
            "status" : NumberInt(4), 
            "time" : ISODate("2019-05-23T23:05:06.000+0000")
        }, 
        {
            "status" : NumberInt(5), 
            "time" : ISODate("2019-05-23T23:05:07.000+0000")
        }, 
        {
            "status" : NumberInt(6), 
            "time" : ISODate("2019-05-23T23:05:09.000+0000")
        }
    ], 
    "requested_completion_utc" : ISODate("2019-05-22T23:05:09.000+0000")
},
{
    "_id" : ObjectId("5d9b69fae4757402b4b4ca1e"), 
    "status_changed_utc" : [
        {
            "status" : NumberInt(1), 
            "time" : ISODate("2019-06-20T23:03:10.000+0000")
        }, 
        {
            "status" : NumberInt(2), 
            "time" : ISODate("2019-07-23T23:04:03.000+0000")
        }, 
        {
            "status" : NumberInt(4), 
            "time" : ISODate("2019-07-23T23:05:06.000+0000")
        }, 
        {
            "status" : NumberInt(5), 
            "time" : ISODate("2019-05-23T23:05:07.000+0000")
        }, 
        {
            "status" : NumberInt(6), 
            "time" : ISODate("2019-07-23T23:05:09.000+0000")
        }
    ], 
    "requested_completion_utc" : ISODate("2019-08-22T23:05:09.000+0000")
},

Я рассчитываю найти запись, у которой дата поля required_completion_utc больше, чем дата изПоле «status_changed_utc», когда «status_changed_utc.status» равно NumberInt (2).

В этом примере я ожидал получить вторую запись.

За исключением функции $ unwind, есть ли другиеспособы решить эту проблему?

Спасибо

Ответы [ 3 ]

0 голосов
/ 12 октября 2019

Требуется найти запись, соответствующую следующему стандарту, как написать запрос без использования размотки?

required_completion_utc> status_changed_utc.time и status_changed_utc.status = 2, где status_changed_utc.time взят из записи, у которой status_changed_utc.status = 2

0 голосов
/ 20 октября 2019

В конце концов мы нашли ответ.

db.getCollection("test").aggregate(

// Pipeline
[
    // Stage 1
    {
        $match: {
            {
                $expr: {
                    $gt:[
                        {   
                            $size: {
                                $filter:{
                                    "input":"$status_changed_utc",
                                    "as":"doc",
                                    "cond":{
                                        $and: [
                                            {
                                                $eq:["$$doc.status",2]
                                            },
                                            {
                                                $gt:["$$doc.time", "$requested_completion_utc"]
                                            }
                                        ]
                                    }
                                }
                            }       
                        },
                        0
                    ]
                }
            }
        }
    },

  ]
);
0 голосов
/ 09 октября 2019

Если NumberInt(2) всегда находится во второй позиции массива. Это должно быть довольно легко.

db.whatever.find({ $expr: { $gt: [ "$requested_completion_utc" , "$status_changed_utc.1" ] } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...