Вы можете попробовать это:
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
.