Mongoose findOneAndUpdateUspert _id null?
정책에 대한 문서를 만들거나 업데이트하는 단일 방법을 원합니다.이와 같은 다양한 기술을 검색하고 시도하면서, 저는 제 문서에 대한 null_id를 생각해냈습니다.findByIdAndUpdate를 사용하는 것도 비슷한 영향을 미칩니다.
컬렉션에 삽입된 문서가 표시되지만 _id 필드가 null입니다.
exports.savePolicy = function (plcy, callback) {
console.log('priority is : ' + plcy.priority)
try {
var policy = new Policy(plcy);
var query = {_id: plcy._id}; //this may be null
var update = {
name: plcy.name || defaults.policyDefaults.name,
longDescription: plcy.longDescription || defaults.policyDefaults.longDescription,
shortDescription: plcy.shortDescription || defaults.policyDefaults.shortDescription,
priority: plcy.priority, colorHex: plcy.colorHex || defaults.policyDefaults.colorHex,
settings: plcy.settings || [],
parentPolicyId: plcy.parentPolicyId || null
}
Policy.findOneAndUpdate(query, update, {upsert: true}, function (err, data) {
callback(err, data);
});
} catch (e) {
log.error('Exception while trying to save policy: ' + e.message);
callback(e, null);
}
업데이트가 아닐 때 _id가 null이 되지 않도록 할 수 있는 방법이 있습니까?
null
유효함_id
MongoDB의 값입니다. 따라서 새 문서에서 사용하지 않으려면 다음을 확인해야 합니다.null
값이 새 값으로 대체됨ObjectID
에query
:
var query = {_id: plcy._id};
if (!query._id) {
query._id = new mongoose.mongo.ObjectID();
}
// the rest stays the same...
저도 같은 문제를 안고 있었고, 그것을 작동시킬 방법을 찾을 수 없었습니다.나는 결국 이렇게 나만의 업써트 방법을 쓰게 되었습니다...
var upsert = function(model, data, f){
if (!data._id) {
model.create(data, f);
} else {
var id = data._id;
delete data._id;
model.findOneAndUpdate({_id: id}, data, f);
}
}
그래서 코드 한 줄로 내 모델들을 부를 수 있어요
upsert(Team, team, f);
더 나은 방법이 있을지도 모르지만, 이것은 저에게 효과가 있습니다.업데이트 및 삽입을 수행할 수 있으며 삽입 시 null_id가 표시되지 않습니다.
조니 덕분에위의 유용한 답변을 위해 HK.저는 그것이 너무 자주 사용되기 때문에 원라이너를 생각해 냈습니다.
query = args._id ? { _id: args._id } : { _id: new ObjectId() };
이는 다음과 같은 요구 사항에 의존합니다.
const ObjectId = require('mongodb').ObjectID;
ID가 있는 경우 문서를 업데이트하거나 ID가 없는 경우 새 문서를 만드는 가장 쉬운 방법은 다음과 같습니다.
Model.findOneAndUpdate({ _id: id ?? new mongoose.Types.ObjectId() }, updates, { upsert: true });
0을 유효한 ID로 허용하는 nullish 병합 연산자(??)를 사용합니다.그updates
개체는 다음을 포함할 필요가 없습니다.id
mongoose가 자동으로 추가할 속성:
필터와 일치하는 문서가 없을 경우 MongoDB는 아래와 같이 필터와 업데이트를 결합하여 하나를 삽입합니다.
저는 Mongoose를 사용하지 않지만 MongoDB와 유사한 문제가 발생했습니다.새 개체가 삽입되었을 때 Upsert 액션의 경우 MongoDB가 설정되었습니다.null
로._id
.
전화하고 있었어요.
findOneAndUpdate({my_id:'my_unique_id'}, obj, {upsert: true})
어디에obj._id
이었다undefined
.
문제는_id
키 목록에 있었습니다.Object.keys(obj)
나는 내가 할당하는 것을 발견했습니다.obj._id = some_variable
,어디에some_variable
이었다undefined
그리고 그것이 원인이 되었습니다._id
키 목록에 표시됩니다.
다시 시작하기 직전에 전화를 걸어 해결 방법을 적용했습니다.
if (_.isUndefined(obj._id)) {
delete obj._id;
}
쿼리 매개변수 또는 대체 문서에서 _id 필드를 지정하면 MongoDB는 삽입된 문서에서 _id 필드를 사용합니다.
그래서 당신이 쓸 때:
model.findOneAndUpdate({_id: id}, data, f);
그리고.id
이라null
다음을 포함하는 문서를 삽입합니다.null
보조로
자바스크립트에서 객체를 파괴하는 동안 기본 속성을 추가할 수 있기 때문에 문서가 존재하는지 확인하는 경우, 기존 _id를 통해 쿼리하거나 동일한 작업에서 null id 문제를 피하면서 새로운 속성을 만드는 가장 쉬운 방법을 찾았습니다.
POST 경로를 사용하는 일부 Controller.js
async function someController(req, res) {
try {
const {
// the default property will only be used if the _id doesn't exist
_id: new mongoose.Types.ObjectId(),
otherProp,
anotherProp
} = req.body;
const createdOrUpdatedDoc = await SomeModel.findOneAndUpdate(
{
_id
},
{
otherProp,
anotherProp
},
{
new: true,
upsert: true
}
).exec();
return res.json(201).json(createdOrUpdatedDoc);
} catch (error) {
return res.json(400).send({
error,
message: "Could not do this"
})
}
}
'new' 매개 변수를 true로 설정해 보십시오.
{ upsert: true, new: true }
더 많은 정보: https://github.com/Automattic/mongoose/issues/2939
업데이트할 호출에서 upsert 매개 변수를 true로 설정해 보십시오.mongoid 문서에서: http://docs.mongodb.org/manual/reference/method/db.collection.update/ #update-parameter
선택적.true로 설정된 경우, 쿼리 기준과 일치하는 문서가 없을 때 새 문서를 작성합니다.기본값은 false이며, 일치하는 문서가 없을 때 새 문서를 삽입하지 않습니다.
언급URL : https://stackoverflow.com/questions/17244363/mongoose-findoneandupdate-upsert-id-null
'programing' 카테고리의 다른 글
Git 하위 모듈 이름 바꾸기 (0) | 2023.06.28 |
---|---|
파이썬의 사이트 패키지 디렉터리는 무엇입니까? (0) | 2023.06.28 |
Apache POI를 사용하여 Excel에서 단일 열 잠금 (0) | 2023.06.28 |
추가되지 않은 특정 행 인덱스에서 데이터 프레임에 새 행을 추가하시겠습니까? (0) | 2023.06.28 |
mysqdump와 일관된 InnoDB 덤프 (0) | 2023.06.28 |