MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Операторът на заявка $expr изглежда не работи с масивна нотация с точки

$expr позволява използването само на оператори на агрегиращи изрази . Нотацията с точка, която използвате, няма да работи за достъп до елемента на масива за полето "values" : [ 1 ] . Трябва да използвате $arrayElemAt оператор и работи добре.

Вашият код find({$expr: {$eq: ["$value1", "$value2"]}}) работи, защото $expr използва оператора на израза за агрегиране $eq ,не операторът на езика за заявки MongoDB (MQL) $eq . Забележете, че и двата оператора изглеждат еднакви, но употребата и синтаксисът са различни.

И кодът find({$expr: {$eq: ["$value1", "$values.0"]}}) не проработи - според очакванията. В оператора за агрегиране $values.0 , 0 се интерпретира като име на поле, а не като индекс на поле от масив.

Точковата нотация работи добре в $expr също. Ето пример с примерен документ:

{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }

Сега използвам $expr и нотация с точка:

db.test.find({ $expr: { $eq: [ "$val.0", 99 ]  } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ]  } } )

И двете заявки връщат документа - съвпадението се случва с филтъра, използващ $expr и нотацията с точка. Но това е валидно само с вградени (или под) документи не с масивни полета.

Формирайте документацията, Оператори на тръбопроводи за агрегиране казва:

изрази :




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. ImportError:Няма модул с име parse

  2. Как да използвам spring data mongo @CompoundIndex с подколекции?

  3. Дизайн на схема на MongoDB - Чат в реално време

  4. NodeJS обратно извикване след множество асинхронни функции във for-цикъл

  5. Как е важен редът на съставните индекси в MongoDB по отношение на производителността?