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

Разделяне на данни около заявка за съвпадение по време на агрегиране

Това агрегиране дава желания резултат.

db.posts.aggregate( [
{ $match:  { updatedAt: { $gte: 1549786260000 } } },
{ $facet: {
        FALSE: [
            { $match: { toggle: false } },
            { $unwind : "$interests" },
            { $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : 1 } } },
        ],
        TRUE: [
            { $match: { toggle: true, status: "INACTIVE" } },
            { $unwind : "$interests" },
            { $group : { _id : { iid: "$interests", pid: "$publisher" }, count: { $sum : -1 } } },
        ]
} },
{ $project: { result: { $concatArrays: [ "$FALSE", "$TRUE" ] } } },
{ $unwind: "$result" },
{ $replaceRoot: { newRoot: "$result" } },
{ $group : { _id : "$_id", count: { $sum : "$count" } } },
{ $project:{ _id: 0, iid: "$_id.iid", pid: "$_id.pid", count: 1 } }
] )


[ РЕДАКТИРАНЕ НА ДОБАВЯНЕ ]

Резултатът от заявката, използвайки входните данни от публикацията на въпроса:

{ "count" : 1, "iid" : "INT123", "pid" : "P789" }
{ "count" : 1, "iid" : "INT123", "pid" : "P123" }
{ "count" : 0, "iid" : "INT789", "pid" : "P789" }
{ "count" : 1, "iid" : "INT456", "pid" : "P789" }


[ РЕДАКТИРАНЕ НА ДОБАВЯНЕ 2 ]

Тази заявка получава същия резултат с различен подход (код):

db.posts.aggregate( [
  { 
      $match:  { updatedAt: { $gte: 1549786260000 } } 
  },
  { 
      $unwind : "$interests" 
  },
  { 
      $group : { 
          _id : { 
              iid: "$interests", 
              pid: "$publisher" 
          }, 
          count: { 
              $sum: {
                  $switch: {
                      branches: [
                        { case: { $eq: [ "$toggle", false ] },
                           then: 1 },
                        { case: { $and: [ { $eq: [ "$toggle", true] },  { $eq: [ "$status", "INACTIVE" ] } ] },
                           then: -1 }
                      ]
                  }          
              } 
          }
      } 
  },
  { 
      $project:{
           _id: 0, 
           iid: "$_id.iid", 
           pid: "$_id.pid", 
           count: 1 
      } 
  }
] )


[ РЕДАКТИРАНЕ НА ДОБАВЯНЕ 3 ]

ЗАБЕЛЕЖКА:

Заявката за аспект изпълнява двата аспекта (TRUE и FALSE) на един и същи набор от документи; това е като две заявки, изпълнявани паралелно. Но има известно дублиране на код, както и допълнителни етапи за оформяне на документите надолу по конвейера, за да получите желания резултат.

Втората заявка избягва дублирането на код и има много по-малки етапи в тръбопровода за агрегиране. Това ще има значение, когато входният набор от данни има голям брой документи за обработка - по отношение на производителността. Като цяло по-малките етапи означават по-малко повторения на документите (тъй като етапът трябва да сканира документите, които са изходни от предишния етап).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Увеличаване на ограничението на паметта за сборни задачи на mongodb

  2. MongoDb:Предимство от използването на ObjectID спрямо низ, съдържащ идентификатор?

  3. Търсете в множество колекции в MongoDB

  4. Използвайте pymongo в django директно

  5. Meteor.js се разгръща в example.com или www.example.com?