sql >> Databáze >  >> NoSQL >> MongoDB

Potřebujete zřetelný počet více polí, která byla připojena z jiné kolekce pomocí agregačního dotazu mongodb

Tohle by mělo stačit. Testoval jsem to na vaší vstupní sadě a záměrně jsem přidal nějaké dupe hodnoty jako NYC zobrazující se ve více než jednom DESTINATION abyste se ujistili, že došlo k odstranění duplicitních údajů (tj. zřetelný počet, jak je požadováno). Pro zábavu zakomentujte všechny fáze a poté je odkomentujte shora dolů, abyste viděli účinek každé fáze potrubí.

var id = "1";

c=db.foo.aggregate([
// Find a thing:
{$match: {"_id" : id}}

// Do the lookup into the objects collection:
,{$lookup: {"from" : "foo2",
            "localField" : "objectsIds",
            "foreignField" : "_id",
            "as" : "objectResults"}}

// OK, so we've got a bunch of extra material now.  Let's
// get down to just the metaDataMap:
,{$project: {x: "$objectResults.metaDataMap"}}
,{$unwind: "$x"}
,{$project: {"_id":0}}

// Use $objectToArray to get all the field names dynamically:
// Replace the old x with new x (don't need the old one):
,{$project: {x: {$objectToArray: "$x"}}}
,{$unwind: "$x"}

// Collect unique field names.  Interesting note: the values
// here are ARRAYS, not scalars, so $push is creating an
// array of arrays:
,{$group: {_id: "$x.k", tmp: {$push: "$x.v"}}}

// Almost there!  We have to turn the array of array (of string)
// into a single array which we'll subsequently dedupe.  We will
// overwrite the old tmp with a new one, too:
,{$addFields: {tmp: {$reduce:{
    input: "$tmp",
    initialValue:[],
    in:{$concatArrays: [ "$$value", "$$this"]}
        }}
    }}

// Now just unwind and regroup using the addToSet operator
// to dedupe the list:
,{$unwind: "$tmp"}
,{$group: {_id: "$_id", uniqueVals: {$addToSet: "$tmp"}}}

// Add size for good measure:
,{$addFields: {size: {"$size":"$uniqueVals"}} }
          ]);


  1. Převeďte ObjectID na řetězec v mongo agregaci

  2. třídy a rozhraní pro psaní typovaných modelů a schémat Mongoose v Typescriptu pomocí rozhodnětypovaného

  3. Odečtěte dílčí dokumenty od shromažďování v souhrnném potrubí

  4. Nastavení MongoDB s node.js:Chyba:Nepodařilo se připojit k [localhost:27017]