2014-07-02 4 views
0

Étant donné l'architecture ci-dessous, y a-t-il un moyen d'interroger la collection de personnes basée sur les colonnes interrogeables et de récupérer un objet comme celui-ci?Utilisation de la limite de 16 Mo avec une requête de type jointure

organization with people: { 
    _id: "13efdsf31r23rwes" 
    name: "Name", 
    wp_slug: "/wordpress-slug/", 
    type: "Cemetary", 
    file_name: "something.csv", 
    columns: [ 
     { label: "Maiden Name", name: "maiden_name", hidden: false }, 
     { label: "First Name", name: "first_name", hidden: false }, 
     { label: "First Pet", name: "first_pet", hidden: true }, 
    ], 
    people: [ 
     { 
      _id: "13okekdsf12313", 
      "organization_id": 13efdsf31r23rwes, 
      "maiden_name": "Gilomen", 
      "surname": "Black", 
      "first_name": "Maria", 
      "first_pet": "Bud the Dog", 
      "searchable_columns": { 
       "surname": ["Black", "Gilomen"], 
       "given": ["Maria"], 
      } 
     }, 
     { 
      _id: "1231sdf1313ewfd", 
      "organization_id": 13efdsf31r23rwes, 
      "maiden_name": "Portland", 
      "surname": "Smith", 
      "first_name": "Rose", 
      "first_pet": "Max the Dog", 
      "searchable_columns": { 
       "surname": ["Smith", "Portland"], 
       "given": ["Rose"], 
      } 
     }, 
     ] 
} 

architecture actuelle:

organization document example: { 
    _id: "13efdsf31r23rwes" 
    name: "Name", 
    wp_slug: "/wordpress-slug/", 
    type: "Cemetary", 
    file_name: "something.csv", 
    columns: [ 
     { label: "Maiden Name", name: "maiden_name", hidden: false }, 
     { label: "First Name", name: "first_name", hidden: false }, 
     { label: "First Pet", name: "first_pet", hidden: true }, 
    ], 
} 

people collection: [ 
    { 
     _id: "13okekdsf12313", 
     "organization_id": 13efdsf31r23rwes, 
     "maiden_name": "Gilomen", 
     "surname": "Black", 
     "first_name": "Maria", 
     "first_pet": "Bud the Dog", 
     "searchable_columns": { 
      "surname": ["Black", "Gilomen"], 
      "given": ["Maria"], 
     } 
    }, 
    { 
     _id: "1231sdf1313ewfd", 
     "organization_id": 13efdsf31r23rwes, 
     "maiden_name": "Portland", 
     "surname": "Smith", 
     "first_name": "Rose", 
     "first_pet": "Max the Dog", 
     "searchable_columns": { 
      "surname": ["Smith", "Portland"], 
      "given": ["Rose"], 
     } 
    }, 
] 

Malheureusement, nous avons atteint la limite de documents 16M quand ils sont stockés sous forme d'un document combiné, donc je dois faire cette solution de contournement. Est-ce possible avec une requête MongoDB directe, ou n'y a-t-il pas d'autre moyen que d'interroger deux fois? Il y a environ 5 millions de dossiers de personnes et plus de 500 organisations. Toute aide serait appréciée, surtout si elle est affichée au format MongoPHP.

+1

Il n'y a aucun moyen d'obtenir un document de mongodb qui dépasse la taille maximale du document (c'est ce qu'on appelle la taille maximale pour une raison). Faites plusieurs requêtes (ou demandez plusieurs documents plus petits) et rejoignez l'application. –

Répondre

0

J'ai réussi à contourner la limitation de taille. En utilisant la "structure souhaitée", je divise le document prévu en plusieurs documents d'une taille inférieure à 16M. En utilisant une requête agrégée, j'ai été en mesure de regrouper toutes les divisions ensemble.

$documents_with_results = $db->organization_data->aggregate(array(
     array('$match' => $search_column_query), 
     array('$unwind' => '$p'), 
     array('$match' => $search_column_query), 
     array('$group' => array(
      '_id' => '$_id', 
      'name' => array('$first' => '$n'), 
      'slug' => array('$first' => '$ws'), 
      'people' => array('$push' => '$p') 
     )) 
    )); 
Questions connexes