Обновите один MongoDB с помощью push, используя значение из другого поля

#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 . спасибо за ваш ответ, я попробовал и не работал с той же ошибкой