MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wygląda na to, że operator zapytania $expr nie działa z notacją z kropką w tablicy

$expr umożliwia użycie tylko operatorów wyrażeń agregacji . Notacja kropkowa, której używasz, nie będzie działać w celu uzyskania dostępu do elementu tablicy dla pola "values" : [ 1 ] . Musisz użyć $arrayElemAt operatora i działa dobrze.

Twój kod find({$expr: {$eq: ["$value1", "$value2"]}}) zadziałało, ponieważ $expr użył operatora wyrażenia agregacji $eq , nie operator języka zapytań MongoDB (MQL) $eq . Zauważ, że oba operatory wyglądają podobnie, ale ich użycie i składnia są inne.

I kod find({$expr: {$eq: ["$value1", "$values.0"]}}) nie działało - zgodnie z oczekiwaniami. W operatorze agregacji $values.0 , 0 jest interpretowany jako nazwa pola, a nie indeks pola tablicy.

Notacja z kropkami działa dobrze w $expr Również. Oto przykład z przykładowym dokumentem:

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

Teraz używam $expr i notacja z kropkami:

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

Oba zapytania zwracają dokument — dopasowanie następuje z filtrem przy użyciu $expr i notacji kropkowej. Ale dotyczy to tylko osadzonych (lub podrzędnych) dokumentów nie z polami tablicy.

Skorzystaj z dokumentacji, Operatorzy potoku agregacji mówi:

wyrażenia :




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $objectToArray

  2. Przyspiesz agregację MongoDB

  3. Tworzenie interfejsów API REST za pomocą EVE

  4. Jaki jest najlepszy sposób obsługi globalnego połączenia Mongodb w NodeJs?

  5. Grupuj według daty z lokalną strefą czasową w MongoDB