2013-09-10 2 views
0

Я использую команду findAndModify для поддержания списка команд отмены/повтора. Я использую тег «fields», чтобы указать, что такое значения «before». Затем это используется для сборки команды отмены. то есть:массив проекции с findandmodify

CMD:

{ 
    findAndModify : "aaa", 
    query : { _id: ObjectId('5215f7d1fe789bb17427bde9') }, 
    update : { "$set" : { "v1" : 200 } }, 
    fields : { v1 : 1, _id : 0 } 
} 

построен результат:

"Do" : { "$set" : { "v1" : 200 } }, 
"Undo" : { "$set" : { v1" : 100 } } 

Однако, я не могу сделать эту работу для массивов. Я делаю набор команд, как это:

{ $set : "myArrayVar.3" : 100 } 

Я попытался с помощью проекции, как:

{ "myArrayVar.3" : 1 } 
{ "myArrayVar.$" : 1 } 

но оба возвращают только пустые скобки массива:

{ myArrayVar : [] } 

Что я упускаю?

+0

@ Discipol yes, field myArrayVar существует и является фактическим массивом. – vesoljc

+0

@Discipol как для проекции id: [link] (http://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/#read-operations-projection) _Important Поле _id, по значение по умолчанию включено в результирующий набор. Чтобы исключить поле _id из набора результатов, вам нужно указать в документе проспекта исключение поля _id (т. Е. {_id: 0}) ._ – vesoljc

ответ

0

Вы не можете использовать числовые индексы массива в прогнозах, но вы можете использовать вместо $slice:

fields: { myArrayVar: { $slice: [2, 1] } } 

Это будет включать в себя только третий элемент (пропустить 2, возьмите 1).

+0

Спасибо, срез действительно работает. Однако есть еще одна проблема, на которую я наткнулся. Теперь проекция возвращает все остальные поля. Я предполагаю, что нет оператора «fieldname: 1». Любые идеи, как объединить этих двух операторов? – vesoljc

+0

Вы можете исключить поля, которые вы не хотите, добавив свойства 'fieldname: 0' в' fields'. – JohnnyHK

+0

Да, исключение действительно заставляет его работать, но, как кажется, если вы указываете одно имя поля: 1, все остальные (кроме id) по умолчанию отключены. Но при использовании среза с массивом я не знаю, как указать только массив. Мне бы очень хотелось избежать установки всех остальных полей в 0, чтобы справиться с этим случаем. – vesoljc

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