programing

Mongoose findOneAndUpdateUspert _id null?

stoneblock 2023. 6. 28. 21:17

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유효함_idMongoDB의 값입니다. 따라서 새 문서에서 사용하지 않으려면 다음을 확인해야 합니다.null값이 새 값으로 대체됨ObjectIDquery:

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개체는 다음을 포함할 필요가 없습니다.idmongoose가 자동으로 추가할 속성:

필터와 일치하는 문서가 없을 경우 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