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

MongoDB агрегатен селективен проект

Изглежда сте на прав път, просто има различни подходи за премахване на тези стойности на false от условното. Не можете да го накарате да връща нищо, но не можете да се отървете от стойностите, които не искате.

Ако наистина искате „набори“ и разполагате с MongoDB 2.6 или по-нова версия, тогава основно филтрирате false стойности, използващи $setDifference :

db.entities.aggregate([
    { "$unwind": "$entities" },
    { "$group": {
        "_id": "$_id",
        "A": { 
            "$addToSet": {
                "$cond": [
                    { "$eq": [ "$entities.type", "A" ] },
                    "$entities.val",
                    false
                ]
            }
        },
        "B": { 
            "$addToSet": {
                "$cond": [
                    { "$eq": [ "$entities.type", "B" ] },
                    "$entities.val",
                    false
                ]
            }
        }
    }},
    { "$project": {
        "A": {
            "$setDifference": [ "$A", [false] ]
        },
        "B": {
            "$setDifference": [ "$B", [false] ]
        }
    }}
])

Или само като една стъпка с помощта на $map оператор вътре в $project :

db.entities.aggregate([
    {"$project": {
        "A": {
             "$setDifference": [
                 {
                     "$map": {
                         "input": "$entities",
                         "as": "el",
                         "in": {
                             "$cond": [
                                 { "$eq": [ "$$el.type", "A" ] },
                                 "$$el.val",
                                 false
                             ]
                         }
                     }
                 },
                 [false]
             ]
         },
        "B": {
             "$setDifference": [
                 {
                     "$map": {
                         "input": "$entities",
                         "as": "el",
                         "in": {
                             "$cond": [
                                 { "$eq": [ "$$el.type", "B" ] },
                                 "$$el.val",
                                 false
                             ]
                         }
                     }
                 },
                 [false]
             ]
         }
    }}
])

Или в противен случай останете с общия $unwind и $match оператори за филтриране на тези:

db.entities.aggregate([
    { "$unwind": "$entities" },
    { "$group": {
        "_id": "$_id",
        "A": { 
            "$push": {
                "$cond": [
                    { "$eq": [ "$entities.type", "A" ] },
                    "$entities.val",
                    false
                ]
            }
        },
        "B": { 
            "$push": {
                "$cond": [
                    { "$eq": [ "$entities.type", "B" ] },
                    "$entities.val",
                    false
                ]
            }
        }
    }},
    { "$unwind": "$A" },
    { "$match": { "A": { "$ne": false } } },
    { "$group": {
        "_id": "$_id",
        "A": { "$push": "$A" },
        "B": { "$first": "$B" }
    }},
    { "$unwind": "$B" },
    { "$match": { "B": { "$ne": false } } },
    { "$group": {
        "_id": "$_id",
        "A": { "$first": "$A" },
        "B": { "$push": "$B" }
    }}
])

Използване на $push за нормални масиви или $addToSet за уникални комплекти.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Индексът вече съществува с грешка при различни опции при използване на createIndex() в най-новия java драйвер на MongoDB

  2. не може да се намери bean за MongoRepository (Spring Boot)

  3. Как да влезете в производството с MongoDB - Топ десет съвета

  4. MongoDB Mongoose прави заявки за дълбоко вложен масив от поддокументи по период от време

  5. Свързване и запитване към база данни на Mongo през SSH с частен ключ в Python