#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