MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

All'interno di un mongodb $match, come testare il campo MATCHING , piuttosto che il campo EQUALING

Quello che vedi nei risultati è corretto. Il tuo approccio è un po' sbagliato. Se vuoi i risultati che ti aspetti, dovresti usare questo approccio:

collection.aggregate([
  {$match:{greetings:{$elemMatch:query}}},
  {$unwind:"$greetings"},
  {$match:{"greetings.hello":"world"}},
]).toArray()

Con questo, dovresti ottenere il seguente output:

[
  {greetings:{hello:"world"}},
  {greetings:{hello:"world"}},
  {greetings:{"hello":"world","extra":"data"}
]

Ogni volta che utilizzi aggregation in MongoDB e vuoi creare una pipeline di aggregazione che produca i documenti che ti aspetti, dovresti sempre iniziare la tua query con la prima fase. E poi eventualmente aggiungere fasi per monitorare gli output delle fasi successive.

L'output del tuo $unwind la fase sarebbe:

[{
  greetings:{hello:"world"}
},
{
  greetings:{hello:"world", extra:"data"}
},
{
  greetings:{hello:"world"}
},
{
  greetings:{aloha:"mars"}
}]

Ora, se includiamo la terza fase che hai utilizzato, corrisponderebbe a greetings chiave che ha un valore {hello:"world"} e con quel valore esatto, troverebbe solo due documenti in cantiere. Quindi otterresti solo:

{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }