Немного разбив этот запрос:
{ agricultureProductSales: true },
Выбирает только истинные значения.
{ agricultureDetail: { $exists: true, $ne: [] } }
Постороннее. Так как вы тестируете поля вложенных документов в этом массиве, эти более поздние тесты не могли бы быть успешными, если массив был пуст или не существовал.
{
$or: [
{ agricultureDetail: { $elemMatch: { title: { $ne: "" } } } },
{
agricultureDetail: { $elemMatch: { title: { $exists: true } } }
}
]
},
Этот тест проверяет, если title
или нет 't равно "" (которое включает элементы, в которых поле не существует) или если поле title
существует. Одно из них всегда верно, поэтому этот $or
всегда будет совпадать. Если вы хотите сопоставлять только те документы, которые содержат элемент с непустым заголовком, проверьте, не превышает ли он ""
- поскольку операторы запросов чувствительны к типу, это не будет соответствовать любому title
, который не не существует, не содержит строку или содержит пустую строку.
"agricultureDetail.title": { $gt: "" }
Аналогично plantCount
, если бы вы проверяли $gt: 0
, это соответствовало бы только документам, содержащим plantCount это число c и больше 0. То, что вы хотите, является логической инверсией этого, поэтому:
"agricultureDetail.production.plantCount": {$not: {$gt: 0}}
В этом случае это будет соответствовать элементам, которые не содержат поле production
, или те, которые имеют пустой массив для поля production
.
Тест существования для plantCount исключит обе эти возможности, поэтому
"agricultureDetail.production.plantCount": {$exists:true, $not: {$gt: 0}}
Как написано, все они проверяют, соответствует ли какой-либо элемент в массиве любой критериев.
Если ваше намерение состоит в том, чтобы соответствовать документу, содержащему один элемент, который соответствует всем критериям, вы должны собрать их вместе в $elemMatch
из agricultureDetail
поля. Таким образом, окончательный запрос может выглядеть примерно так:
db.collection.find({
agricultureProductSales: true,
agricultureDetail:{$elemMatch:{
title: {$gt: ""},
"production.plantCount": {$exists:true, $not: {$gt: 0}}
}}
})
Playground