sql >> Database >  >> NoSQL >> MongoDB

MongoDB:find and findOne met geneste array-filtering

Ik zal TL;DR aangezien dit een helse rit bleek te zijn. Ik heb $elemMatch geprobeerd , ik heb $redact geprobeerd (ook met $$CURRENT en $$ROOT), ik heb $map geprobeerd , ik heb het aggregatieraamwerk geprobeerd, ik heb $project geprobeerd .

Je kunt er hier alles over lezen:https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/

TL;DR

De oplossing lijkt te zijn om het aggregatieraamwerk te gebruiken om de array te filteren en de eigenschap comments met de resultaten te overschrijven. Dit is eenvoudiger dan het klinkt:

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

Het resultaat:

{
  "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. Hoe hernoem je een MongoDB-database?

  2. Een lijst krijgen van unieke ingesloten/geneste objecten in een MongoDB-document

  3. Spring Data MongoDB en bulkupdate

  4. Indexen maken in MongoDB via .NET