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.???'}}])
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.???'}}])
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
Można zrobić go inline za pomocą operatora $concat
:
db.something.aggregate(
[
{ $match :
{ 'property' :
{ $exists:true }
}
},
{ $project:
{ stringId:
{ $concat: [ ObjectId().str ] }
}
}
]
)
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
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. –
@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
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. –