MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB:намерете и findOne с филтриране на вложени масиви

Ще TL;DR тъй като това се оказа адски езда. Опитах $elemMatch , опитах $redact (също с $$CURRENT и $$ROOT), опитах $map , опитах рамката за агрегиране, опитах $project .

Можете да прочетете всичко за това тук:https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/

TL;DR

Решението изглежда е да се използва рамката за агрегиране за филтриране на масива и замяна на свойството comments с резултатите. Това е по-просто, отколкото звучи:

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

Резултатът:

{
  "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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как мога да използвам туитове от API за стрийминг на Twitter и да ги съхранявам в mongodb

  2. Мониторинг на Percona сървър за MongoDB – ключови показатели

  3. Не може да се свърже с MongoDB чрез node.js в Docker

  4. MongoDB findOneAndReplace()

  5. Как да намерите документи, отговарящи на множество критерии