2016-03-17 11 views
13

Czy istnieje operator mogę użyć w łącznej funkcji, aby uzyskać ciąg zamiast objectID w odpowiedzi?

db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}]) 
+2

No nie ma. Ramy agregacja nie ponownie rzucać żadnych typów danych (z wyjątkiem napisu z numeryczny poprzez '$ substr' i numerycznej Data lub Data do numeryczna jest w zasadzie możliwe oszustwa). Dlaczego uważasz, że jest to potrzebne? W większości języków napisanie wartości 'ObjectId' jako łańcucha jest dość proste. –

+1

@BlakesSeven Zawsze jest dlaczego :) Z powodu prostoty. Oczywiście możesz to opublikować. Ale byłoby miło, gdybym mógł przekazać wynik innej służbie/grupie, która wymaga zwykłego napisu. ... – matus

+1

No jak powiedziałem, z większości języków BSON właśnie oddane do lokalnych typów. A w przypadku "większości" języków nie ma żadnej pracy wymaganej do wyprowadzenia w postaci ciągu. Osobiście wolę rozszerzony formularz wyjściowy JSON, tj. '{" $ Oid ":" 56ea9e8bb1e015d13b376db5 "}' ponieważ przynajmniej pozwala to zdalnemu klientowi wiedzieć, że dane są rzeczywiście "ObjectId", aby mógł on sam poprawnie analizować i rzutować. To dobrze, zwłaszcza biorąc pod uwagę, że pojemność pamięci wynosi ** połowa ** bajtów długości łańcucha. –

Odpowiedz

6

nie ma bezpośredniego Operator w funkcji zbiorczej, aby uzyskać ciąg z objectID.

Po wersji 2.6 można używać ObjectId.toString() metodę konwersji objectID do łańcucha. Najpierw dopasuj i wyeksportuj swój ObjectID. Następnie możesz przekonwertować ten identyfikator obiektu na łańcuch znaków, używając ObjectID.toString().

db.something.aggregate([{"$match":{'property': {$exists:true}}},{"$project":{"_id":1}}]) 

a następnie użyć Powstały obiekt i uzyskać ciąg jako odpowiedź za pomocą ObjectID.tostring()

Edit: Można uzyskać dostęp do atrybutu str identyfikatora obiektu przy użyciu

ObjectId("507f191e810c19729de860ea").str

źródło: mongodb docs

-11

Można zrobić go inline za pomocą operatora $concat:

db.something.aggregate(
    [ 
     { $match : 
      { 'property' : 
       { $exists:true } 
      } 
     }, 
     { $project: 
      { stringId: 
       { $concat: [ ObjectId().str ] } 
      } 
     } 
    ] 
) 
+0

Dla mnie to nie robi „stringID” The objectID rekordu. To sprawia, że ​​jest to usztywniona wersja zupełnie nowego ObjectId. W szczególności ma tę samą wartość dla wszystkich zwróconych dokumentów. Więc nie sądzę, że to jest właściwe. – mcdave

Powiązane problemy