MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :find et findOne avec filtrage de tableaux imbriqués

Je vais TL;DR puisque cela s'est avéré être un enfer d'un tour. J'ai essayé $elemMatch , j'ai essayé $redact (également avec $$CURRENT et $$ROOT), j'ai essayé $map , j'ai essayé le framework d'agrégation, j'ai essayé $project .

Vous pouvez tout lire ici :https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/

TL;DR

La solution semble être d'utiliser le framework d'agrégation pour filtrer le tableau et remplacer la propriété comments par les résultats. C'est plus simple qu'il n'y paraît :

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]}
    }}}}
);

Le résultat :

{
  "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
      }
    }
  ]
}