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

Как да върнете оригиналния документ обратно след агрегиране

Попадане в категорията глупави трикове за агрегиране е малка техника, която често се пренебрегва.

Заявката, която прави всичко, е групиране около документа _id, който е уникалният идентификатор за този документ. Така че основният момент, за който трябва да помислите, е целият документ всъщност вече е уникален идентификатор. Така че вместо просто да съхранявате в ключа _id, използвайте целия документ.

    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },

Когато това се прави, всичко, което се навива от _id, запазва документа в оригиналния му вид. В края на всички други етапи на агрегиране издайте окончателен $project за да възстановите истинския оригинален формуляр на документа:

    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}

След това ще имате филтрираните резултати, които искате. Тази техника може да бъде много удобна, когато се използва с разширено филтриране, като например в случая на тази заявка, тъй като премахва необходимостта от издаване на допълнително находка върху всички резултати.

Освен това, в такъв случай, когато знаете, че търсите само набор от резултати, които ще отговарят на определен набор от условия, използвайте $match оператор като първи етап на тръбопровода за агрегация. Това не само е полезно за намаляване на размера на работния комплект, но е и единствено етап, на който можете да използвате индекс и където можете значително да увеличите ефективността на заявката.

Целият процес заедно:

db.forms.aggregate([
    {$match: { "forms.status": "closed" } },
    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },
    {$unwind: "$forms"},
    {$group: { _id: "$_id", status: {$addToSet: "$forms.status"}}},
    {$unwind: "$status"},
    {$sort: { _id: 1, status: -1} },
    {$group: { _id: "$_id", status: {$first: "$status"} }},
    {$match: { status: "closed"}},
    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB изтеглящ елемент от масив от колекция

  2. Mongo как да $търси с DBRef

  3. Как да избегнем transparent_hugepage/defrag предупреждение от mongodb?

  4. Как мога да преименувам поле за всички документи в MongoDB?

  5. Съвпадение с подниз в агрегирането на mongodb