개체의 값을 업데이트하는 방법이 있습니까?
{
_id: 1,
name: 'John Smith',
items: [{
id: 1,
name: 'item 1',
value: 'one'
},{
id: 2,
name: 'item 2',
value: 'two'
}]
}
id = 2 인 항목의 이름과 값 항목을 업데이트하고 싶다고 가정 해 보겠습니다.
나는 몽구스와 함께 다음을 시도했습니다.
var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set': {'items.$': update}}, function(err) { ...
이 접근 방식의 문제점은 전체 개체를 업데이트 / 설정한다는 것이므로이 경우에는 id 필드가 손실됩니다.
몽구스에서 배열의 특정 값을 설정하고 다른 값은 그대로 두는 더 좋은 방법이 있습니까?
나는 또한 Person에 대해 쿼리했습니다.
Person.find({...}, function(err, person) {
person.items ..... // I might be able to search through all the items here and find item with id 2 then update the values I want and call person.save().
});
답변
당신은 가깝습니다. $
업데이트 연산자 를 사용하려면 점 표기법을 사용해야 합니다.
Person.update({'items.id': 2}, {'$set': {
'items.$.name': 'updated item2',
'items.$.value': 'two updated'
}}, function(err) { ...
답변
model.update({"_id": 1, "items.id": "2"},
{$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})
답변
몽구스 방법이 있습니다.
const itemId = 2;
const query = {
item._id: itemId
};
Person.findOne(query).then(doc => {
item = doc.items.id(itemId );
item["name"] = "new name";
item["value"] = "new value";
doc.save();
//sent respnse to client
}).catch(err => {
console.log('Oh! Dark')
});
답변
각 문서에 대해 업데이트 연산자 $set
는 여러 값을 설정할 수 있으므로 items
배열 의 전체 객체를 바꾸는 대신 객체 의 name
및 value
필드를 개별적으로 설정할 수 있습니다 .
{'$set': {'items.$.name': update.name , 'items.$.value': update.value}}
답변
하나 이상의 조건을 기준으로 배열에서 객체를 검색 할 때 $ elemMatch 를 사용하는 것을 기억해야합니다.
Person.update(
{
_id: 5,
grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
},
{ $set: { "grades.$.std" : 6 } }
)
여기에 문서가 있습니다
답변
update(
{_id: 1, 'items.id': 2},
{'$set': {'items.$[]': update}},
{new: true})
여기에 대한 문서입니다 $[]
: https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up은. S []
답변
다음은 객체 배열의 값을보다 동적으로 업데이트하는 방법의 예입니다.
Person.findOneAndUpdate({_id: id},
{
"$set": {[`items.$[outer].${propertyName}`]: value}
},
{
"arrayFilters": [{ "outer.id": itemId }]
},
function(err, response) {
...
})
이렇게하면 arrayFilters
다음과 같이 추가하여 중첩 배열의 더 깊은 수준을 업데이트 할 수 있습니다 .
"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value}
"arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]
도움이되기를 바랍니다. 행운을 빕니다!