2016-03-17 1 views
13

Есть ли оператор, который я мог бы использовать в aggregate функция, чтобы получить строку вместо ObjectId в ответ?

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

Нет там нет. Рамка агрегации не перебрасывает любые типы данных (за исключением строки из числа с помощью '$ substr' и numeric в Date или Date, чтобы числовое значение в принципе возможно с обманом). Почему вы так думаете? В большинстве языков довольно просто написать значение «ObjectId» как строку в любом случае. –

+1

@BlakesSeven Всегда есть почему :) Из-за простоты. Конечно, вы можете опубликовать его. Но было бы неплохо, если бы я мог просто передать результат другой службе/стороне, которая требует простой строки. ... – matus

+1

Ну, как я уже сказал, с большинством языков BSON просто отбрасывается на локальные типы. А для «большинства» языков вообще не требуется работа для простого вывода в виде строки. Лично я предпочитаю расширенную форму вывода JSON i.e '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}', поскольку, по крайней мере, это позволяет удаленному клиенту знать, что данные действительно являются «ObjectId», поэтому он может самостоятельно анализировать и корректно отображать. Это хорошо, особенно учитывая, что память составляет ** половину ** байтов длины строки. –

ответ

6

В функции агрегата нет прямого оператора, чтобы получить 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

-11

Вы можете сделать это рядный с помощью оператора $concat:

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

Для меня это не делает «stringId» ObjectId записи. Это делает его строгой версией нового ObjectId. В частности, это одинаковое значение для всех возвращенных документов. Поэтому я не думаю, что это правильно. – mcdave

Смежные вопросы