#javascript #node.js #mongodb #mongoose #mongodb-query
Вопрос:
Я пытаюсь переместить существующее поле моего документа в свой массив. это моя схема :
var mySchema = new Schema({ level: { type: Number, default: 1 }, mHierarchy: [ { userId: { type: mongoose.Types.ObjectId }, index: { type: Number } } ] })
я пытаюсь использовать updateOne и нажать на mHierarchy и установить внешний уровень для индекса.
то, что я пробовал до сих пор:
MySchema.updateOne( {'_id': mySchemaId}, $push: { referredHierarchy: { userId: mongoose.Types.ObjectId(id), index: '$level' } } )}
Я также попробовал это:
let setQuery= {} setQuery['mHierarchy.' level '.userId']= mongoose.Types.ObjectId(userId) setQuery['mHierarchy.' level '.index']= '$temp' MySchema.updateOne( {'_id': mySchemaId}, { $set: setQuery }, {let: {temp: '$level'}} )
и ничего из вышеперечисленного не работает, и я получаю эту ошибку :
"CastError: Cast to Number failed for value "$temp" (type string) at path "index""
как я могу добиться этого с помощью мангуста?
ПРИМЕЧАНИЕ: Я использую MongoDB 5 и «мангуст»: 6.0.8
Комментарии:
1. Чтобы обновить поле другим значением поля того же документа, вы можете использовать функцию Обновления с конвейером агрегации (MongoDB версии 4,2 или выше).
2. Я хотел увеличить
level
, но для простоты я удалил его. ваш ответ верен, если я не использую$inc
операцию,$inc
не заданную в конвейере. Спасибо.3. Используйте
$add
оператор агрегирования для увеличения на значение.4. @prasad_ можете ли вы протестировать свое решение или опубликовать свой ответ? Я попробовал конвейер без использования
$add
и@inc
, но я не мог подтолкнуть его к своему массиву правильным способом.5. @prasad_ Я наконец-то понял это. если вы можете отправить свой ответ, я могу принять его для использования другими. Большое спасибо!
Ответ №1:
Сначала вам нужно будет добавить это поле в конвейер с помощью оператора $set. Попробуй вот это:
MySchema.updateOne({ _id: mySchemaId }, { $set: { index: "$level", }},{ $push: { referredHierarchy: { userId: mongoose.Types.ObjectId(id), index: "$index", }, }});
Попробуйте другой обходной путь по причинам тестирования:
MySchema.updateMany({ _id: mySchemaId },[{ $addFields: { index: "$level", }},{ $push: { referredHierarchy: { index: "$index", }, }}]);
updateOne не принимает операторов агрегации конвейеров, поэтому попробуйте использовать это обновление для тестирования.
Комментарии:
1. Я получаю эту ошибку :
MongooseError: Invalid update pipeline operator: "$push"
2. Попробуйте мое последнее редактирование.
3. все еще не работает, хотя я думаю, что в вашем коде есть ошибка, основанная на вашем
{
и}
.вы использовали$push
option
вместоupdate
.4. updateOne МОЖЕТ принимать агрегацию конвейеров. дело в том, что агрегация конвейеров НЕ МОЖЕТ быть принята
$push
. спасибо за ваш ответ, я попробовал и не работал с той же ошибкой