sql >> Database >  >> NoSQL >> MongoDB

Gelokaliseerde gegevens opvragen in MongoDB

Om een ​​generieke query te maken, heb je het aggregatieraamwerk nodig, omdat het een aantal handige operators heeft om je hierbij te helpen. Om te beginnen moet u het ingesloten document converteren naar een array van sleutel/waarde-paren en vervolgens de array filteren op het sleutelveld waarbij de landinstelling als parameter wordt doorgegeven.

Converteer bijvoorbeeld het document

  "title": {
    "en": "title en2",
    "de": "title de2"
  },

naar een array

  "title": [
    { "k": "en", '"v": "title en2" },
    { "k": "de", "v": "title de2" }
  ],

met behulp van $objectToArray exploitant. U kunt deze array vervolgens filteren op het sleutelveld met behulp van de $filter operator als

{
    '$filter': {
        'input': { '$objectToArray': '$title' },
        'cond': { '$eq': ['$$this.k', locale] }
    }
}

waarbij de variabele landinstelling is afgeleid van de doorgegeven parameter.

Zodra u de gefilterde array hebt, vereist het verkrijgen van het waardeveld de $arrayElemAt operator toegepast op de waardetoets als

{ 
    '$arrayElemAt': ['$title.v', 0]
}

Dus uiteindelijk zul je een pijplijn als deze moeten gebruiken:

var locale = 'en';

db.cs.aggregate([
    { '$match': { "cID" : "00001" } },
    { '$addFields': {
        'title': {
            '$filter': {
                'input': { '$objectToArray': '$title' },
                'cond': { '$eq': ['$$this.k', locale] }
            }
        },
        'desc': {
            '$filter': {
                'input': { '$objectToArray': '$desc' },
                'cond': { '$eq': ['$$this.k', locale] }
            }
        }
    } },

    { '$addFields': {
        'title': { 
            '$arrayElemAt': ['$title.v', 0]
        },
        'desc': { 
            '$arrayElemAt': ['$desc.v', 0]
        }
    } }
]);

En met wat aanpassingen:

var locale = 'en';
var getFilterOperatorExpression = function (field) {
    return {
        '$filter': {
            'input': { '$objectToArray': '$'+ field },
            'cond': { '$eq': ['$$this.k', locale] }
        }
    }
};
var getValueOperatorExpression = function (field) { 
    return { 
        '$arrayElemAt': ['$'+ field +'.v', 0]
    }
};

db.cs.aggregate([
    { '$match': { "cID" : "00001" } },
    { '$addFields': {
        'title': getFilterOperatorExpression('title'),
        'desc': getFilterOperatorExpression('desc'),
    } },

    { '$addFields': {
        'title': getValueOperatorExpression('title'),
        'desc': getValueOperatorExpression('desc')
    } }
]);


  1. Atomiciteit van findAndModify op ingesloten documenten

  2. MongoDB wat zijn de standaardgebruiker en het standaardwachtwoord?

  3. Hoe update-bewerkingen in GridFS uitvoeren (met Java)?

  4. limieten van het aantal collecties in databases