sql >> Database teknologi >  >> NoSQL >> MongoDB

Forespørgsel på lokaliserede data i MongoDB

For at oprette en generisk forespørgsel ville man have brug for aggregeringsrammen, da den har nogle praktiske operatører til at hjælpe dig med dette. Til at begynde med skal du konvertere det indlejrede dokument til et array af nøgle/værdi-par og derefter filtrere arrayet på nøglefeltet, der passerer lokaliteten som parameter.

Konverter f.eks. dokumentet

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

til et array

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

ved hjælp af $objectToArray operatør. Du kan derefter filtrere dette array på nøglefeltet ved hjælp af $filter operatør som

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

hvor variablen locale er afledt af den beståede parameter.

Når du har det filtrerede array, kræver det $arrayElemAt operator anvendt på værdinøglen som

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

Så i sidste ende bliver du nødt til at køre en pipeline som denne:

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]
        }
    } }
]);

Og med lidt refaktorering:

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. Sådan implementeres Open Source-databaser

  2. Migrering til MongoDB:hvordan man forespørger GROUP BY + WHERE

  3. hvorfor får jeg favicon.ico, når jeg bruger findOne-metoden til express params-ruter?

  4. .NET bedste praksis for MongoDB-forbindelser?