$ ne: Сравнить дату ввода с полем в массиве

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Я создал для этого тестовую коллекцию, и она выглядит следующим образом:

 {
    "createDate": ISODate("2021-01-04T15:00:00.000 00:00"),
    "arr": [
        {
            "date": ISODate("2021-01-04T15:00:00.000 00:00")
        }
    ]
},
{
    "createDate": ISODate("2021-01-04T16:00:00.000 00:00"),
    "arr": [
        {
            "date": ISODate("2021-01-04T15:00:00.000 00:00")
        }
    ]
}
 

Единственное отличие заключается в том, что первая запись имеет одну и ту же дату, вторая — разные даты.

Теперь я хочу создать запрос, чтобы найти все записи, где две даты отличаются. Я попробовал это с помощью этого:

 db.getCollection('test').find(
    {
        "createDate": { $ne: "arr.0.date" }
    }
)
 

К сожалению, этот запрос доставляет мне обе записи. Что я делаю не так?

Ответ №1:

Для доступа к элементу из определенного индекса используйте $arrayElemAt для сопоставления в выражении $expr, которое сравнивает поля из одного и того же документа.

 db.getCollection('test').find({
  $expr: {
    $ne: [
      "$createDate",
      { $arrayElemAt: ["$arr.date", 0] }
    ]
  }
})
 

Игровая площадка

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

1. Спасибо, это работает! Но не могли бы вы, пожалуйста, объяснить, зачем мне это нужно $expr ? Это только из $arrayElemAt -за того, что нельзя использовать в запросе?

2. Есть 2 условия: 1) когда мы сопоставляем условие с внешним значением { createdAt: "2020-12-12" } , 2) для сопоставления ссылочного поля / внутреннего поля / обоих полей в документе, { createdAt: "$arr.date" } для чего требуется $ expr, в противном случае совпадение определит, что это внешнее совпадение, а не внутреннее. это не только для $arratElemAt, это требует, чтобы при установке условия во внутренних документах поля проверяли playgorund