#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