sql >> Databasteknik >  >> NoSQL >> MongoDB

Min $or-väljare i ett databasutlösare matchningsuttryck fungerar inte på den andra nivån av kapsling när du konfigurerar en databasutlösare

Så jag kunde komma runt det här problemet genom att ändra frågan så att den tittar efter ett fält som uppdateras samtidigt men som inte är kapslat. Jag tror att problemet med att leta efter ett kapslat fält är att ChangeEvent s updateDescription egenskapen innehåller inte det faktiska kapslade objektet som har ändrats; istället innehåller den punktnotationsrepresentationen av förändringen. Så om du tittar på Uppdatering 2 i mitt inlägg ser du att updatedFields har detta värde:{\"someOtherField\":310,\"message.fansNo\":1... istället för {\"someOtherField\":310,\"message\":{\"fansNo\":1... . Genom att använda message.fansNo i $match-frågan kommer Mongo att leta efter denna objektform:{\"message\":{\"fansNo\":1... , vilket inte stämmer överens i det här fallet. En "riktig" lösning här kan vara att undkomma . i message.fansNo i mitt matchuttryck, men jag kunde inte få det att fungera (se den här tråden ).

Så "lösningen" som fungerade för mig är egentligen bara en lösning som fungerar för mitt specifika användningsfall:det händer att someOtherField uppdateras alltid tillsammans med message.fansNo och someOtherField är inte kapslad. Så jag kan matcha someOtherField utan att oroa sig för häckning. I grund och botten ger detta matchningsuttryck mig de resultat jag vill ha:

{
  "$or": [
    {
      "updateDescription.updatedFields.someOtherField": {"$exists":true}
    },
    {
      "updateDescription.updatedFields.someOtherField":{"$exists":true}
    }
  ]
}

Hoppas detta hjälper någon annan!




  1. MongoDB - $addToSet på en lista över inbäddade dokument

  2. Mongodb - uppdatera en del av antalet dokument

  3. Laravel App körs inte på xampp eller live server men fungerar bra på php artisan serve

  4. GridFSDBFile i vårstart 2.0.1 release