$ elemMatch работает с обычным полем внутри массива? - PullRequest
1 голос
/ 07 августа 2020
"grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],

Здесь оценки - это массив, обозначенный [], но внутреннее поле score не является массивом, так как оно содержит нормальное значение 2 или 6.

Итак, почему следующий запрос использует $ elemMatch вместо score ?

db.restaurants.find ({grades: {$ elemMatch: {"score": {$ gt: 90}}}});

https://www.w3resource.com/mongodb-exercises/mongodb-exercise-8.php

1 Ответ

1 голос
/ 07 августа 2020

Согласно документации :

Оператор $ elemMatch сопоставляет документы, содержащие поле массива, по крайней мере, с одним элементом, который соответствует всем указанным критериям запроса.

Итак, в этом случае левая сторона grades - это массив, который вы хотите запросить, используя $elemMatch. Правая сторона представляет собой запрос (score > 90), который оценивается по каждому элементу массива grades, и если он возвращает true для любого элемента, то документ будет возвращен.

В качестве альтернативы, в этом случае вы можете использовать синтаксис точечной записи:

.find( { 'grades.score': { $gte: 90 } } )

, что может быть более интуитивно понятным.

...