2017-10-06 3 views
1

Ce sont des données de collecte « entreprise »

{ 
    _id: "1", 
    company: "ABC", 
    addresses: [ 
    { 
     _id: "2", 
     address: "a1", 
     district: "d1", 
     city: "c1" 
    }, 
    { 
     _id: "3", 
     address: "a2", 
     district: "d2", 
     city: "c2" 
    }, 
    { 
     _id: "4", 
     address: "a3", 
     district: "d3", 
     city: "c3" 
    } 
    ] 
} 

Ceci est de données de collecte « produit »

{ 
    product: "xyz", 
    companyid: "1",   //_id of record in company's collection 
    addresses: ["2", "4"] //addresses _id of record in company's collection 
}, 
{ 
    product: "pqr", 
    companyid: "1", 
    addresses: ["3", "4"] 
} 

Maintenant, je dois obtenir tous les produits avec la société et leurs adresses comme ci-dessous

{ 
    product: "xyz", 
    company: "ABC", 
    addresses: [ 
    { 
     _id: "2", 
     address: "a1", 
     district: "d1", 
     city: "c1" 
    }, 
    { 
     _id: "4", 
     address: "a3", 
     district: "d3", 
     city: "c3" 
    } 
    ] 
}, 
{ 
    product: "pqr", 
    companyid: "ABC", 
    addresses: [ 
    { 
     _id: "3", 
     address: "a2", 
     district: "d2", 
     city: "c2" 
    }, 
    { 
     _id: "4", 
     address: "a3", 
     district: "d3", 
     city: "c3" 
    } 
    ] 
} 

S'il y a un tableau, seulement dans les produits, nous pouvons les dérouler et effectuer une recherche. Mais dans cette condition il y a des tableaux dans les deux collections, alors comment pouvons-nous les comparer ou utiliser $ lookup pour obtenir la sortie attendue? S'il y a une autre alternative, s'il vous plaît faites le moi savoir.

Répondre

2

Vous pouvez essayer d'exécuter l'opération globale suivante pour obtenir le résultat souhaité:

db.product.aggregate([ 
    { 
     "$lookup": { 
      "from": "company", 
      "localField": "companyid", 
      "foreignField": "_id", 
      "as": "company" 
     } 
    }, 
    { 
     "$addFields": { 
      "company": { "$arrayElemAt": ["$company", 0] } 
     } 
    }, 
    { 
     "$addFields": {    
      "addresses": { 
       "$filter": { 
        "input": "$company.addresses", 
        "as": "ad", 
        "cond": { 
         "$setIsSubset": [ 
          ["$$ad._id"], 
          "$addresses" 
         ] 
        } 
       } 
      } 
     } 
    }, 
    { "$project": { "company": 0 } } 
]) 
+1

Grande utilisation de setIsSubset $. –