2017-10-20 3 views
0

Je cherche le moyen de résoudre ce problème et je ne le trouve pas. J'apprécie ton aide.Comment changer la réponse dans MongoDB en utilisant des champs traduisibles

J'ai une collection avec des produits tels que:

[ 
    { 
     "name": [ 
      { "es": "Producto 1" }, 
      { "en": "Product 1" } 
     ] 
     "reference": "PR1", 
     "price": "20", 
     "description": [ 
      { "es": "Descripción 1" }, 
      { "en": "Description 1" } 
     ] 
    } 
] 

Et je voudrais faire:

db.products.aggregate(); // Recherche par langue es par exemple:

et obtenez:

[ 
    { 
     "name": "Producto 1", 
     "reference": "PR1", 
     "price": "20", 
     "description": "Descripción 1" 
    } 
] 

Merci beaucoup.

+0

Ceci n'est pas possible avec find. Vous devez utiliser l'agrégation ou une alternative. Comment ressemble votre json complet? –

+0

Salut Alex, merci pour la réponse rapide. Pouvez-vous donner un exemple en utilisant agrégation pour avoir cette réponse? Merci mon pote. – Jorge

Répondre

0

je suggère un changement de schéma bien à ceci:

[ 
     { 
      "name" : [ 
       { 
        "language" : "es", 
        "description" : "Producto 1" 
       }, 
       { 
        "language" : "en", 
        "description" : "Product 1" 
       } 
      ], 
      "reference" : "PR1", 
      "price" : "20", 
      "description" : [ 
       { 
        "language" : "es", 
        "description" : "Descripción 1" 
       }, 
       { 
        "language" : "en", 
        "description" : "Description 1" 
       } 
      ] 
     } 
] 

la cause alors vous pourriez effectivement groupe par la langue dans votre cas. Si cela est possible, vous pouvez alors effectuer les opérations suivantes:

db.products.aggregate([ 
{$unwind: "$someName"}, 
{$unwind: "$someName.name"}, 
{$unwind: "$someName.description"}, 
{ 
    $group: { 
     _id: {namelang: "$someName.name.language", namedesc: "$someName.description.language"}, 
     name: {$first: "$someName.name.description"}, 
     reference: {$first: "$someName.reference"}, 
     price: {$first: "$someName.price"}, 
     description: {$first: "$someName.description.description"} 
    } 
}, 
{ 
    $match: { 
     "_id.namelang": "en", 
     "_id.namedesc": "en" 
    } 
} 
]) 

Pour votre information, puisque vous ne l'avez pas fourni votre JSON complet j'ai créé un hasard. Voici le schéma complet:

{ 
    "_id" : ObjectId("59ea07a600f5db2660dbf162"), 
    "someName" : [ 
     { 
      "name" : [ 
       { 
        "language" : "es", 
        "description" : "Producto 1" 
       }, 
       { 
        "language" : "en", 
        "description" : "Product 1" 
       } 
      ], 
      "reference" : "PR1", 
      "price" : "20", 
      "description" : [ 
       { 
        "language" : "es", 
        "description" : "Descripción 1" 
       }, 
       { 
        "language" : "en", 
        "description" : "Description 1" 
       } 
      ] 
     } 
    ] 
}