MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Potrzebujesz odrębnej liczby dla wielu pól, które zostały połączone z innej kolekcji za pomocą zapytania agregującego mongodb

To powinno załatwić sprawę. Przetestowałem to na twoim zestawie wejściowym i celowo dodałem kilka duplikatów, takich jak NYC pojawia się w więcej niż jednym DESTINATION aby upewnić się, że został usunięty z błędu (tj. wyraźna liczba zgodnie z prośbą). Dla zabawy skomentuj wszystkie etapy, a następnie odkomentuj z góry na dół, aby zobaczyć efekt każdego etapu potoku.

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. BŁĄD:proces potomny nie powiódł się, zakończono z błędem numer 1,mongodb

  2. Zaktualizuj wiele elementów w tablicy w mongodb

  3. Zapytanie Spring Data MongoDB AND/OR z wieloma opcjonalnymi parametrami

  4. przeszukiwanie bazy danych za pomocą mongoose api i nodejs?

  5. Mongoose findbyid() zwraca null