Есть ли оператор, который я мог бы использовать в aggregate функция, чтобы получить строку вместо ObjectId в ответ?
db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}])
Есть ли оператор, который я мог бы использовать в aggregate функция, чтобы получить строку вместо ObjectId в ответ?
db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}])
В функции агрегата нет прямого оператора, чтобы получить String из ObjectId.
После версии 2.6 Вы можете использовать метод ObjectId.toString()
для преобразования объекта ObjectId в строку. Сначала вы сопоставляете и проектируете свой ObjectID. Затем вы можете преобразовать этот идентификатор объекта в строку, используя ObjectID.toString()
.
db.something.aggregate([{"$match":{'property': {$exists:true}}},{"$project":{"_id":1}}])
И затем использовать полученный объект и получить строку как ответ, используя ObjectID.tostring()
Edit: Вы можете получить доступ к атрибуту ул Идентификации объекта с помощью
ObjectId("507f191e810c19729de860ea").str
источник: mongodb docs
Вы можете сделать это рядный с помощью оператора $concat
:
db.something.aggregate(
[
{ $match :
{ 'property' :
{ $exists:true }
}
},
{ $project:
{ stringId:
{ $concat: [ ObjectId().str ] }
}
}
]
)
Для меня это не делает «stringId» ObjectId записи. Это делает его строгой версией нового ObjectId. В частности, это одинаковое значение для всех возвращенных документов. Поэтому я не думаю, что это правильно. – mcdave
Нет там нет. Рамка агрегации не перебрасывает любые типы данных (за исключением строки из числа с помощью '$ substr' и numeric в Date или Date, чтобы числовое значение в принципе возможно с обманом). Почему вы так думаете? В большинстве языков довольно просто написать значение «ObjectId» как строку в любом случае. –
@BlakesSeven Всегда есть почему :) Из-за простоты. Конечно, вы можете опубликовать его. Но было бы неплохо, если бы я мог просто передать результат другой службе/стороне, которая требует простой строки. ... – matus
Ну, как я уже сказал, с большинством языков BSON просто отбрасывается на локальные типы. А для «большинства» языков вообще не требуется работа для простого вывода в виде строки. Лично я предпочитаю расширенную форму вывода JSON i.e '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}', поскольку, по крайней мере, это позволяет удаленному клиенту знать, что данные действительно являются «ObjectId», поэтому он может самостоятельно анализировать и корректно отображать. Это хорошо, особенно учитывая, что память составляет ** половину ** байтов длины строки. –