MongoDB: Получить документы с длиной массива> = 2 - PullRequest
1 голос
/ 27 января 2020

Обращение за помощью, чтобы исправить этот запрос mongoDb / mon goose. Он должен выполнить:

  • оценить количество элементов массива 'host'

  • вернуть в массив только документы, содержащие более 2 элементов

  • наконец, запрос должен вернуть все документы / объекты БД со ВСЕМИ ПОЛЯМИ, следуя приведенным выше параграфам.

Образец документа:

{
    "_id" : ObjectId("XXXXXXXXX"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.XXX", 
            "smtp.YYYY", 
        ],
        "status" : false,
        "date" : ISODate("2020-01-27T14:36:08.311Z",
}

Попытка 1:

db.getCollection('emails').find({'sentEmail.status': false}, {$where:'sentEmail.host >= 2'})

Проблема: Не возвращается ВСЕ поля, возвращается только ID

Попытка 2:

db.getCollection('emails').find({'sentEmail.host.1': {$exists:true}, 'sentEmail.status': false})

Проблема: Возвращает только первый найденный объект.

1 Ответ

0 голосов
/ 27 января 2020

Вы можете попробовать это:

db.getCollection('emails').find({$expr :{$and : [{$eq :['$sentEmail.status', false]},
                                            {$gte: [{$size:'$sentEmail.host'},2]}]}})

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e2f26ead02e05b6948bc302"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.XXX", 
            "smtp.YYYY"
        ],
        "status" : false,
        "date" : ISODate("2020-01-27T14:36:08.311Z")
    }
}

/* 2 */
{
    "_id" : ObjectId("5e2f26f1d02e05b6948bc3b5"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.YYYY"
        ],
        "status" : false,
        "date" : ISODate("2020-01-27T14:36:08.311Z")
    }
}

/* 3 */
{
    "_id" : ObjectId("5e2f26ffd02e05b6948bc4c8"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.XXX", 
            "smtp.YYYY", 
            "smtp.ZZZZ"
        ],
        "status" : false,
        "date" : ISODate("2020-01-27T14:36:08.311Z")
    }
}

/* 4 */
{
    "_id" : ObjectId("5e2f2bd2d02e05b6948c2c58"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.XXX", 
            "smtp.YYYY", 
            "smtp.ZZZZ"
        ],
        "status" : true,
        "date" : ISODate("2020-01-27T14:36:08.311Z")
    }
}

Результат:

/* 1 */
{
    "_id" : ObjectId("5e2f26ead02e05b6948bc302"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.XXX", 
            "smtp.YYYY"
        ],
        "status" : false,
        "date" : ISODate("2020-01-27T14:36:08.311Z")
    }
}

/* 2 */
{
    "_id" : ObjectId("5e2f26ffd02e05b6948bc4c8"),
    "content" : "ASdkJAHKDA",
    "time" : ISODate("2020-01-24T17:20:00.023Z"),
    "sentEmail" : {
        "host" : [ 
            "smtp.XXX", 
            "smtp.YYYY", 
            "smtp.ZZZZ"
        ],
        "status" : false,
        "date" : ISODate("2020-01-27T14:36:08.311Z")
    }
}

Если не вернуть документ с "_id" : ObjectId("5e2f26f1d02e05b6948bc3b5"), потому что размер sentEmail.host < 2 && "_id" : ObjectId("5e2f2bd2d02e05b6948c2c58") не возвращается, потому что он имеет sentEmail.status: true.

...