Mongoose / Node: вставить элемент в поле документа типа array?

#javascript #node.js #arrays #mongoose #schema

#javascript #node.js #массивы #мангуст #схема

Вопрос:

У меня есть схема Mongoose с полем типа array, предназначенным для хранения нескольких строк:

 const exampleSchema = new.mongooseSchema({
      field1: String,
      field2: String,
      field3: [String]
})
 

Я настраиваю серверную часть для объединения / ввода новых строк в массив field3, надеясь получить что-то вроде этого:

 {
   field1: 'some string',
   field2: 'some other string',
   field3: [
              'string inside array1',
              'string inside array2',
              'string inside array3',
           ]
}
 

Я пытаюсь сделать это с помощью findByIdAndUpdate() и пытался использовать такие вещи, как операторы распространения, для объединения новых строк в поле 3, но я не совсем уверен в том, как использовать синтаксис.

Есть ли какой-нибудь чистый способ сделать это без необходимости создавать новый обновленный объект для замены всего документа?

Ответ №1:

Вам нужно только $push .

Проверьте этот пример, чтобы узнать синтаксис.

Использование mongo выглядит следующим образом

 db.collection.update({
  /* Your find object*/
},
{
  "$push": {
    "field3": "another string"
  }
})
 

Используя $push вы можете добавить значение в массив. Легко.

И использование moongoose точно такое же, вы должны передать объект push в параметры.

 model.findByIdAndUpdate(your_id, {
  "$push": {
    "field3": "another string"
  }
})
 

Ответ №2:

Как я научился обновлять небольшую часть элемента в mongoose, заключается в следующем:

 const example = await exampleSchema.findById(id)

// Return if non existing
if (!example )
  return res
    .status(404)
    .send(`Example with id:${id} was not found.`)

// Sets the new field3
example.field3 = [...example.field3, req.body.addedField3]

try {
  const result = await example.save()
  res.send(result)
} catch (exeption) {
  res.status(400).send(exeption.message)
}
 

Это завернуто в router.put express.Router