programing

몽구스: "_doc"는 무슨 일입니까?

megabox 2023. 7. 13. 20:46
반응형

몽구스: "_doc"는 무슨 일입니까?

Mongoose는 내부적으로 정말 펑키한 일을 하고 있는 것 같습니다.

var Foo = new mongoose.model('Foo', new mongoose.Schema({a: String, b: Number}));
var foo = new Foo({a: 'test'; b: 42}); 
var obj = {c: 1};
foo.goo = obj;                  // simple object assignment. obj should be 
                                  //   passed by reference to foo.goo. recall goo
                                  //   is not defined in the Foo model schema

console.log(foo.goo === obj);   // comparison directly after the assignment
    // => false, doesn't behave like normal JS object

기본적으로, 당신이 Mongoose 모델의 특성을 다루려고 할 때마다 그렇지 않습니다.

모델의 스키마에 정의되거나

동일한 유형(array, obj, ...)으로 정의... 모델이 일반 Javascript 개체처럼 작동하지 않습니다.

4호선 전환foo._doc.goo = obj 출력을 콘출력만다니로 .true.

편집: 이상함을 재현하려고 합니다.

1:

 // Customer has a property 'name', but no property 'text'
 // I do this because I need to transform my data slightly before sending it
 // to client.
 models.Customer.find({}, function(err, data) {
     for (var i=0, len=data.length; i<len; ++i) {
        data[i] = data[i]._doc;            // if I don't do this, returned data
                                           // has no 'text' property
        data[i].text = data[i].name;       
    }
    res.json({success: err, response:data});
});

몽구스 개체에 _doc이 존재합니다.

mongooseModel.findOne은 모델 자체를 반환하므로 모델에는 구조(보호 필드)가 있습니다.console.log를 사용하여 개체를 인쇄하려고 하면 console.log가 개체 공용 필드를 인쇄하기 때문에 데이터베이스의 데이터만 제공됩니다.

JSON.stringify와 같은 것을 시도하면 mongoose 모델 객체 내부를 볼 수 있습니다.(_doc, 상태...)

개체에 필드를 추가하려고 하는데 작동하지 않는 경우

const car = model.findOne({_id:'1'})
car.someNewProp = true // this will not work

나중에 객체 차량에 속성을 설정하고 이전에 모델 스키마에 지정하지 않은 경우 Mongoose 모델은 이 필드가 존재하고 올바른 유형인지 확인합니다.유효성 검사에 실패하면 속성이 설정되지 않습니다.

갱신하다

원래 질문하신 내용을 제가 잘못 이해한 것 같은데, 이제 질문의 성격이 바뀐 것 같아서 아래 내용은 관련이 없지만 남겨드립니다 :)

저는 당신의 코드를 테스트했고 그것은 저에게 잘 작동합니다.Mongoose는 스키마의 일부가 아닌 속성(또는 몇 가지 다른 특수 속성)을 설정할 때 특별한 코드를 실행하지 않습니다.는 Mongoose의 집합을 수 ).goo예를 들어 속성).

따라서 속성을 설정할 때 다음을 수행합니다.

foo.goo = { c: 1 };

몽구스는 연루되지 않았습니다.만약 당신이console.log당신이 표시한 코드와 다른 것이었습니다, 저는 그것이 잘못 보고될 수도 있다는 것을 알 수 있었습니다.

추가적으로, 당신이.send는 JSON, JSON으로 .JSON.stringify호출 중입니다. 호출됩니다.toStringMongoose 모델에 있습니다.이 경우 Mongoose는 스키마에 정의된 속성만 사용합니다.따라서 기본적으로 추가 속성이 다시 전송되지 않습니다.당신은 그것의 본질을 바꿨습니다.data배열은 Mongoose 데이터를 직접 가리키기 때문에 이러한 문제를 피할 수 있습니다.

정상 동작에 대한 세부 정보

을 할 때goo몽구스를 사용하면, 꽤 많은 일들이 일어납니다.는 Mongoose 다음세게자터산해통/▁get를 통해 속성 게터/를 생성합니다.Object.defineProperty(일부 문서).그래서, 당신이 설정할 때goo[String]일이 : 몇가지일발생다니합이다:발합.

  1. Mongoose 코드는 객체 인스턴스에 값이 설정되기 전에 호출됩니다(단순한 JavaScript 객체와 달리).
  2. 저장할 을 (Mongoose " (으)로 표시됨).MongooseArray배열 데이터를 포함합니다.제공한 예제에서는 배열을 통과하지 못했으므로 배열이 생성됩니다.
  3. Mongoose가 올바른 유형으로 데이터를 캐스트합니다.
  4. 그것은 부를 것입니다.toString캐스트의 일부로 전달된 데이터에.

이제 문서에 다음과 같은 배열이 포함되어 있습니다.toString전달한 개체의 버전입니다.

당이그내확인면다했을용의 하셨다면.goo요소를 수 . 즉, 속, 이, 제, 하, 는을 포함하는 문자열입니다.[object Object]보다 기본적인 유형을 선택했거나 대상 속성 저장소 유형과 일치하는 경우 기본 동일성 검사가 작동했음을 알 수 있습니다.

_doc 대신 JSON()을 사용할 수 있습니다.

린을 사용해 보십시오.

기본적으로 Mongoose 쿼리는 Mongoose Document 클래스의 인스턴스를 반환합니다.문서는 변경 추적을 위한 내부 상태가 많기 때문에 바닐라 JavaScript 개체보다 훨씬 무겁습니다.희박 옵션을 활성화하면 Mongoose는 전체 Mongoose 문서 인스턴스화를 건너뛰고 POJO만 제공합니다.

https://mongoosejs.com/docs/tutorials/lean.html

같은 문제가 있었습니다.내 모델을 업데이트하는 대신.

const car = model.findOne({_id:'1'})
let temp = JSON.stringify(car);
let objCar = JSON.parse(temp);
objCar.color = 'Red'; //now add any property you want

이것이 내 문제를 해결합니다.

난 오늘 이 일에 매달렸어요...미치겠어요.아래의 해결책이 좋은 것인지는 잘 모르겠지만(OP에서도 언급한 바 있습니다), 저는 이렇게 이 문제를 극복했습니다.

내 차량 목표:

 cars = [{"make" : "Toyota"}, {"make" : "Kia"}];

작업:

console.log("1. Cars before the color: " + car);

cars.forEach(function(car){
     car.colour = "Black";   //color is NOT defined in the model. 
});

console.log("2. Cars after the color: " + car);

문제가 있는 콘솔 출력:

   1. Cars before the color: [{"make" : "Toyota"}, {"make" : "Kia"}];
   2. Cars after the color: [{"make" : "Toyota"}, {"make" : "Kia"}];   //No change! No new colour properties :(

모델에 정의되지 않은 이 속성을 doc(예: car._doc.color = "black")을 통해 전달하려고 하면 작동합니다(이 색상 속성은 각 차량에 할당됨). 그러나 어떤 이유로 EJS(프론트엔드)통해 액세스할 없는같습니다.

해결책: (다시 말하지만, 이것이 최선의 방법인지 확실하지 않습니다...하지만 저한테는 효과가 있었어요):이 새 특성(색상)을 자동차 모델에 추가합니다.

var carSchema = mongoose.Schema({
   make: String,
   color: String   //New property.
})

모델이 재정의되면서 모든 것이 정상/예상대로 작동했습니다(_doc '핵'이 필요하지 않음 등). 저는 하루를 더 살았습니다. 다른 사람에게 도움이 되기를 바랍니다.

스프레드(...)를 사용하거나 솔루션을 볼 수 없는 사용자의 경우, @entesar의 답변 예제가 여기 있습니다.

스프레드 또는 ._docin 대신:

import User from "./models/user";

...
async function createUser(req, res) {
  const user = await User.create(req.body);


  res.status(201).json({
    message: "user created",
    data: {
        ...user // OR user._doc,
        token: "xxxxxxxx",
     },
   });
}
...

사용

import User from "./models/user";

...
async function createUser(req, res) {
  const user = await User.create(req.body);


  res.status(201).json({
    message: "user created",
    data: {
        ...user.toJSON(),
        token: "xxxxxxxx",
     },
   });
}
...

Ps: 답을 이해하는 데 시간이 좀 걸렸습니다.

모델 '매직'을 건너뛰려면 검색 결과를 추가해야 합니다.

Mongoose 모델에 이상한 점이 있으며 Mongoose 모델 배열에 생성된 모델이 없는지 확인해야 합니다.

제 솔루션은 다음과 같습니다.

import mongoose from 'mongoose';
createModel = (modelName="foo", schemaDef, schemaOptions = {})=> {
  const { Schema } = mongoose;
  const schema = Schema(schemaDef, schemaOptions);
  const Model = mongoose.models[modelName] || mongoose.model(modelName, schema);
  return Model;
}

저는 저만의 몽구스 모델 클래스와 기본 클래스를 모델에 사용합니다.제가 만든 건데 잘 될 거예요.

언급URL : https://stackoverflow.com/questions/18821212/mongoose-whats-up-with-doc

반응형