MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Dentro de um $match do mongodb, como testar o campo MATCHING , em vez do campo EQUALING


O que você está vendo nos resultados está correto. Sua abordagem está um pouco errada. Se você deseja os resultados esperados, use esta abordagem:
collection.aggregate([
  {$match:{greetings:{$elemMatch:query}}},
  {$unwind:"$greetings"},
  {$match:{"greetings.hello":"world"}},
]).toArray()

Com isso, você deve obter a seguinte saída:
[
  {greetings:{hello:"world"}},
  {greetings:{hello:"world"}},
  {greetings:{"hello":"world","extra":"data"}
]

Sempre que você estiver usando aggregation no MongoDB e deseja criar um pipeline de agregação que produza os documentos esperados, você deve sempre iniciar sua consulta com o primeiro estágio. E, eventualmente, adicione estágios para monitorar as saídas dos estágios subsequentes.

A saída do seu $unwind estágio seria:
[{
  greetings:{hello:"world"}
},
{
  greetings:{hello:"world", extra:"data"}
},
{
  greetings:{hello:"world"}
},
{
  greetings:{aloha:"mars"}
}]

Agora, se incluirmos o terceiro estágio que você usou, ele corresponderia a greetings chave que tem um valor {hello:"world"} e com esse valor exato, encontraria apenas dois documentos no pipeline. Então você só estaria recebendo:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }