2017-06-21 3 views
1

J'ai besoin de filtrer mon document commercial en fonction d'un type de service.comment filtrer après mongodb peuplé

var BusinessSchema = Schema({ 
    name: String, 
    slug: String, 
    service: [{type: Schema.ObjectId, ref: 'Service'}], 
    owner: {type: Schema.ObjectId, ref: 'User'} 

}); 

module.exports = mongoose.model('Business', BusinessSchema); 

Et le service est le schéma:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var ServiceSchema = Schema({ 
    name: String, 
}); 

module.exports = mongoose.model('Service', ServiceSchema); 

de ce tableau d'entreprises aurait seulement besoin ceux qui ont au sein de ses services, le "Service A", par exemple.

"business": [ 
     { 
      "_id": "594957df4e195d2500324726", 
      "owner": "59482e80d4df7208503154b8", 
      "slug": "Almacene2s", 
      "name": "Almacene2s", 
      "__v": 0, 
      "service": [ 
       { 
        "_id": "594ab160778ae82c44af3a78", 
        "name": "Service C", 
        "__v": 0 
       }, 
       { 
        "_id": "594ab1be778ae82c44af3a7a", 
        "name": "Service D", 
        "__v": 0 
       } 
      ], 

     }, 
     { 
      "_id": "5948483e6bcc1f2788b09145", 
      "owner": "59482e80d4df7208503154b8", 
      "slug": "guaranda-2", 
      "name": "Guaranda Fig", 

      "service": [ 
       { 
        "_id": "594ab160778ae82c44af3a78", 
        "name": "Service A", 
        "__v": 0 
       }, 
       { 
        "_id": "594ab1be778ae82c44af3a7a", 
        "name": "Service B", 
        "__v": 0 
       } 
      ], 

     } 
] 

Dans ce cas, le résultat que je veux obtenir est:

{ 
      "_id": "5948483e6bcc1f2788b09145", 
      "owner": "59482e80d4df7208503154b8", 
      "slug": "guaranda-2", 
      "name": "Guaranda Fig", 

      "service": [ 
       { 
        "_id": "594ab160778ae82c44af3a78", 
        "name": "Service A", 
        "__v": 0 
       }, 
       { 
        "_id": "594ab1be778ae82c44af3a7a", 
        "name": "Service B", 
        "__v": 0 
       } 
      ], 

     } 

Il est très important pour moi d'être en mesure de mener à bien cette recherche, car le système permet à l'utilisateur de choisir comme un filtre l'entreprise qui a le service désiré.

C'est mon premier projet sur nodejs + mongodb et j'aimerais avoir votre aide avant de continuer. Merci beaucoup

Répondre

0

En utilisant $lookup, voici ce que vous pouvez réaliser:

Service.aggregate([ 
    { 
     $match: { 
      "name": "Service A" 
     } 
    }, 
    { 
     $lookup: { 
      from: "business", 
      localField: "_id", 
      foreignField: "service", 
      as: "businesses" 
     } 
    } 
], function(err, result) { 
    console.log(result); 
}); 

Dans ce pipeline d'agrégation, vous premier match et de trouver des documents de service avec le nom "Service A". Ensuite, recherchez service tableau de documents commerciaux pour les correspondants et placez-les dans le champ businesses. Le résultat ressemblera à ceci:

{ 
    "_id" : "594af96883ab76db8ecd021b", 
    "name" : "Service A", 
    "businesses" : [ 
     { 
      "_id" : "594af9a683ab76db8ecd0225", 
      "slug" : "Almacene2s", 
      "owner" : "59482e80d4df7208503154b8", 
      "name" : "Almacene2s", 
      "service" : [ 
       "594af96883ab76db8ecd021b", 
       "594af96883ab76db8ecd021d" 
      ] 
     } 
    ] 
}