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

MongoDB:find og findOne med indlejret array-filtrering

Jeg vil TL;DR da dette viste sig at være en helvedes tur. Jeg har prøvet $elemMatch , jeg har prøvet $redact (også med $$CURRENT og $$ROOT), jeg har prøvet $map , Jeg har prøvet aggregeringsrammerne, jeg har prøvet $project .

Du kan læse alt om det her:https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/

TL;DR

Løsningen ser ud til at være at bruge aggregeringsrammen til at filtrere arrayet og tilsidesætte kommentaregenskaben med resultaterne. Dette er enklere, end det lyder:

db.getCollection('posts').aggregate(
    {$match: {"author.id": authorId}},
    {$addFields : {"comments":{$filter:{ // We override the existing field!
        input: "$comments",
        as: "comment",
        cond: {$eq: ["$$comment.state.deleted", false]}
    }}}}
);

Resultatet:

{
  "author": {},
  "message": "This is post1",
  "comments": [
    {
      "message": "Im number 1!!!",
      "state": {
        "deleted": false
      }
    },
    {
      "message": "tHIS IS GREAT!",
      "state": {
        "deleted": false
      }
    },
    {
      "message": "I can type better than you guys",
      "state": {
        "deleted": false
      }
    }
  ]
},
{
  "author": {},
  "message": "This is post 2",
  "comments": [
    {
      "message": "I wanna have your children",
      "state": {
        "deleted": false
      }
    }
  ]
}



  1. Forstå Hadoop High Availability Feature

  2. Sådan finder du en understreng i et felt i Mongodb

  3. $filter inde i $project MongoDB ved hjælp af Spring Data

  4. Sådan filtreres array i underdokument med MongoDB