J'essaie d'augmenter les performances d'une exécution de requête. MongoDB contient trois (ou plus) collections avec des documents qui ont la même structure. Quelque chose comme ca:

db.france.insertMany([
    {field1: 11, field2: 12, field3: 13},
    {field1: 21, field2: 22, field3: 23},
    {field1: 31, field2: 32, field3: 33}
])

db.germany.insertMany([
    {field1: 11, field2: 12, field3: 13},
    {field1: 21, field2: 22, field3: 23},
    {field1: 31, field2: 32, field3: 33}
])

db.belgium.insertMany([
    {field1: 11, field2: 12, field3: 13},
    {field1: 21, field2: 22, field3: 23},
    {field1: 31, field2: 32, field3: 33}
]) 

Quelle devrait être la requête (une requête) pour obtenir le résultat comme celui-ci à partir de deux collections "france" et "germany":

[
    {field1: 21, field2: 22, field3: 23},
    {field1: 21, field2: 22, field3: 23}    
] 

Merci beaucoup.

1
bbKid 26 oct. 2020 à 10:29

2 réponses

Meilleure réponse

Tu peux essayer,

  • $match si vous souhaitez rechercher un champ de document spécifique
  • $group par null et préparer un tableau de documents france
  • $lookup à avec germany collection et obtenir tous les documents
  • $project pour concater le document des deux tableaux à la racine en utilisant $concatArrays
  • $unwind déconstruire le tableau racine
  • $replaceWith pour remplacer l'objet racine dans root
db.france.aggregate([
  // { $match: { field1: 21 } } // optional
  {
    $group: {
      _id: null,
      france: { $push: "$$ROOT" }
    }
  },
  {
    $lookup: {
      from: "germany",
      pipeline: [
        // { $match: { field1: 21 } } // optional
      ],
      as: "germany"
    }
  },
  {
    $project: {
      root: {
        $concatArrays: ["$france", "$germany"]
      }
    }
  },
  { $unwind: "$root" },
  { $replaceWith: "$root" }
])

Terrain de jeux

Remarque: Si vous avez des millions d'enregistrements dans les deux collections, je ne vous suggère pas d'utiliser cette requête, cette requête pourrait être lourde en vitesse et en efficacité, vous devez modifier la conception de votre schéma ou vous pouvez exécuter 2 requêtes et combiner les deux résultats.

1
turivishal 26 oct. 2020 à 07:57

Je crains qu'il n'y ait pas de solution simple pour cela. Vous devrez fusionner manuellement les deux documents sur votre serveur.

Mais dans ce cas, je dirais que c'est plus un problème de conception de schéma. Dans ce cas, je vous recommande de stocker tous les documents dans une seule collection. Ensuite, ajoutez simplement un champ country.

Ensuite, vous pouvez facilement interroger vos documents avec la requête suivante:

Coll.find({ country: { $in: ["france", "germany"], field1: 21, field2: 22, field3:23 })

0
Sihoon Kim 26 oct. 2020 à 07:40