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

MongoDB заявка с условна група по израз

Вашият код не работи, защото $cond не е акумулаторен оператор. Само тези акумулиращи оператори, могат да се използват в $group сцена.

Ако приемем, че вашите записи съдържат не повече от две възможни стойности на source както споменахте във въпроса си, можете да добавите условен $project етап и модифицирайте $group етап като,

Код:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceA": { $first: "$source" },
                "sourceB": { $last: "$source" }
            }
        },
        {
            $project: {
                "source": {
                    $cond: [
                        { $eq: ["$sourceA", "email"] },
                        "$sourceB",
                        "$sourceA"
                    ]
                }
            }
        }
    ])

В случай че може да има повече от две възможни стойности за източник, можете да направите следното:

  • Group чрез id , firstName , lastName и code . Натрупвайте уникалните стойности на source , използвайки $addToSet оператор.
  • Използвайте $redact за да запазите само стойностите, различни от email .
  • Project задължителните полета, ако source масивът е празен (всички елементи са премахнати), добавете стойност email към него.
  • Unwind полето източник, за да го посочи като поле, а не като масив. (по избор)

Код:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceArr": { $addToSet: { "source": "$source" } }
            }
        },
        {
            $redact: {
                $cond: [
                    { $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
                    "$$PRUNE",
                    "$$DESCEND"
                ]
            }
        },
        {
            $project: {
                "source": {
                    $map: {
                        "input":
                        {
                            $cond: [
                                { $eq: [{ $size: "$sourceArr" }, 0] },
                                [{ "source": "item" }],
                                "$sourceArr"]
                        },
                        "as": "inp",
                        "in": "$$inp.source"
                    }
                }
            }
        }
    ])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. използвайки $и с $match в mongodb

  2. Как да обхождате вложен документ рекурсивно в MongoDB

  3. 4 начина за изброяване на колекциите в база данни на MongoDB

  4. Може ли MongoDB да бъде пакетиран в приложение Electron?

  5. Не може да се ПУБЛИКУВА в nodejs и mongodb на openshift