Mongoose: モデル曎新メ゜ッドはバリデヌタヌを尊重したせん

䜜成日 2012幎04月24日  Â·  59コメント  Â·  ゜ヌス: Automattic/mongoose

model.Updateメ゜ッドを䜿甚しお、スキヌマの制玄に関係なく任意の倀に曎新できたす

たずえば、enumプロパティを持぀スキヌマがある堎合、updateを䜿甚しお、enum制玄倖の任意の倀に倉曎できるため、セットが無効になりたす。

予想される動䜜は、曎新された倀が怜蚌されなかった堎合に゚ラヌをスロヌするこずでした。

最初の゚ラヌで終了するかどうかを指定するために、updateメ゜ッドに远加のオプションを提案したす。

new feature

最も参考になるコメント

+1

曎新で䜿甚されないのは完党に盎感的ではありたせんデフォルト、セッタヌ、怜蚌、列挙型。 コア操䜜がスキヌマに準拠しおいない堎合、スキヌマはどのように䜿甚されたすか。

党おのコメント59件

strictスキヌマ蚭定を有効にしお、無効なスキヌマパスを無芖し、残りを曎新するこずをお勧めしたす。 ゚ラヌはスロヌされたせん。

new Schema{..}、{stricttrue}

スキヌマに存圚しないパスを蚭定するずスロヌされるが、 model.update間にスロヌされない、マヌゞを埅機しおいる同様のプルリク゚ストがありたす。 たぶん、それを䞊蚘のPRに远加しお、゚ラヌをコヌルバックに枡す必芁がありたす。

こんにちは、迅速な返信ありがずうございたす。

私は無効なパスを参照しおいたせんでしたが、特定のパス内の制玄を参照しおいたした。

この䟋を芋おください

var User = new Schema{
ナヌザヌ名{
タむプ文字列、
小文字true、
トリムtrue、
ナニヌクtrue
}、
名前 {
タむプ文字列、
トリムtrue、
必須true、
䞀意false、
むンデックスtrue
}、
パスワヌド{
タむプ文字列、
必須true、
遞択false、
セット暗号化
}、
圹割 {
タむプ文字列、
"デフォルト" 'ナヌザヌ'、
"enum"['user'、 'admin'、 'root']
}、
䜜成した {
タむプ日付、
「デフォルト」Date.now
}
}、{stricttrue};

users.update{"username" "test"}、{"role" "thisShowldFail"}、functionerr、val{
..。
};

厳密なスキヌマオプションが有効になっおいる堎合でも、「test」ナヌザヌには「thisShowldFail」の圹割があるこずに泚意しおください。
リスペクト列挙型や他の同様のオプションを曎新するべきではありたせんか

あなたは正しいです、それは列挙型を怜蚌する必芁がありたす。 どこかにチケットがあるず思いたした。

+1、この問題のために#updateを䜿甚できたせん。

.updateに、新しいドキュメント+ .saveが実行するすべおのこずを実行させるこずは可胜ですか

  • デフォルト
  • セッタヌ
  • カスタム怜蚌
  • 列挙型

アップサヌトオプションが䜿甚されおいる堎合も

  • 必芁

珟圚はありたせん

぀たり、実装は可胜/蚈画されおいたすか... :)

それはいいかもしれたせん。 関連472

+1

曎新で䜿甚されないのは完党に盎感的ではありたせんデフォルト、セッタヌ、怜蚌、列挙型。 コア操䜜がスキヌマに準拠しおいない堎合、スキヌマはどのように䜿甚されたすか。

+1

私はマングヌスが倧奜きですが、それが曎新を怜蚌しない堎合、それは私にずっおはるかに圹に立ちたせん。 倧きなドキュメントがあり、怜蚌のためだけにダりンロヌドしたくありたせん。

これは私が飛び蟌んでいるこずです。私はこれを実装しようずしお、少し飛び蟌みたす。
目暙は次のこずです。

  • デフォルト
  • セッタヌ
  • 怜蚌
  • 列挙型
  • 必芁

私が成功するかどうかさえわかりたせんが、私はそれをやっおみたす。 バリデヌタヌから始めたす。

幞運を祈りたす

メルク。

+1

+1

.updateが怜蚌をサポヌトしおいれば、すばらしいず思いたす。

バンプ+1

でこがこのバンプ+1

曎新時に怜蚌を远加しおください

+1

線集-2マングヌスが怜蚌を担圓するべきではないず思うので..怜蚌が必芁な堎合は、JSONスキヌマ怜蚌を蚱可するもののような他の特殊なラむブラリの䜿甚を怜蚎する必芁がありたす

@thalesfspはい。 これは過去に詊みられたしたが、ドキュメントがメモリに存圚せず、いく぀かの状況で壊れお動䜜に䞀貫性がなく混乱するため、ルヌルが非垞に䞍安定になりたす。

オヌプン゜ヌスの矎しさ機胜が必芁な堎合は、それを蚘述しお、正しく機胜するこずを蚌明するテストずドキュメントに合栌したプルリク゚ストを送信できたす。

かなり深刻な制限。 パッチを適甚する堎合、スキヌマオブゞェクトを盎接クロヌルしお、バリデヌタヌを実行する必芁があるかどうかを刀断するのが珟実的でしょうか。 私は䞻に、曎新に適甚されるカスタムバリデヌタヌず列挙型ルヌルに関心がありたす。 他のスキヌマ制玄は、ドキュメントが保存されたずきにすでに適甚されおいるはずだず思いたす。 列挙型ずバリデヌタヌだけに至るたで問題をこのように単玔化するこずは理にかなっおおり、曎新䞭にドキュメントを甚意する必芁がなくなりたすか

+1バンプ、これは非垞に䟿利な機胜です-曎新を行うずき、スキヌマから最小/最倧などが尊重されるこずを確認したい-そうでなければ、マングヌスができるこずのために倚くの定型ロゞックを実行しおいたす

これが起こるのを芋るのは玠晎らしいこずです。 珟時点での回避策は、オブゞェクトを芋぀け、フィヌルドを倉曎しおから保存するこずです。これにより、怜蚌ミドルりェアが起動したす。 ドキュメントによるず

Tank.findById(id, function (err, tank) {
  tank.size = 'large';
  tank.save(function (err) {
   // Document updated, do something with it
  });
});

updateコマンドはMongoに盎接委任され、ドキュメント党䜓が怜蚌のためにメモリに保存されないため、これは泚意が必芁です。 したがっお、 @ BrianHoldsworthによっお提案されたアプロヌチは、曎新されるフィヌルドに察しおのみ怜蚌を実行するスキヌマを解析するこずから始めるのに適した堎所のようです。

@aheckmannは、このパッチを詊みた人が同じ間違いを二床ず起こさないように、以前の倱敗した実装䜜業の詳现を教えおいただけたすか

私は䞻に、曎新に適甚されるカスタムバリデヌタヌず列挙型ルヌルに関心がありたす。 他のスキヌマ制玄は、ドキュメントが保存されたずきにすでに適甚されおいるはずだず思いたす。 列挙型ずバリデヌタヌだけに至るたで問題をこのように単玔化するこずは理にかなっおおり、曎新䞭にドキュメントを甚意する必芁がなくなりたすか

@BrianHoldsworthこれは単玔化しrequired: true怜蚌制玄のあるフィヌルドが空の文字列に曎新された堎合はどうなりたすか 怜蚌゚ラヌを発生させるには、これが必芁になりたす。

私もこれに興味がありたす。 おそらく、.updateメ゜ッドをオヌバヌラむドしお怜蚌を実行するプラグむンを䜜成できたすか そうすれば、郚分的な゜リュヌションでも実装できたす。 䞀方、コアにある堎合は、あらゆる皮類の怜蚌を凊理し、100堅牢であるこずが期埅されたす。

カスタムバリデヌタヌず列挙型の䞡方で、これにも遭遇したした。 怜玢しおから曎新するこずは可胜ですが、ドキュメントのサブドキュメント構造が異なる堎合、䞀般的なケヌスコヌドを蚘述するこずは非垞に困難です。

+1バンプこれ。

ブラむアンの゜リュヌションはかなり゚レガントに芋えたす。 パッチがベヌタ版に達したずきに通知を受け取りたいです。

+1

この+1が必芁

+1

+1

+1

+1

3.9.3では、 update()にsetDefaultsOnInsertずrunValidators 2぀の特別なオプションがあり、デフォルトを蚭定しおク゚リでバリデヌタヌを実行したす。 たずえば、テストを参照しおください。実際のドキュメントはただありたせん:(

どうもありがずうございたした-これは玠晎らしい修正です

@ vkarpov15私はあなたのコヌドを䜿甚しお、

こんにちは、アップデヌト時に怜蚌を䜿甚するために、安定バヌゞョン3.9がい぀リリヌスされるか知っおいたすか

ありがずう

@AlexandreAWE良い質問です。 私は珟圚、4.0ず3.9.xブランチのベヌタテストで物事をたずめおいたすが、今は「完了したら完了したす」ずいうこずです。 クリスマス前にRCを出したいです。

@ vkarpov15 3.9.xの安定版ではどうですか 珟圚のプロゞェクトを毎回芋぀けお保存する代わりに、曎新時に怜蚌を行うのは玠晎らしいこずです。

@andrewholstedは、 mongodbドラむバヌ2.0ずmongodbサヌバヌ2.8が安定するのを埅っおいたす。これは今月行われるこずを願っおいたすが、最新バヌゞョンのmongodbず最新ドラむバヌをサポヌトしないず4.0を出荷するこずはできたせん。 詳现に぀いおは、私のブログを参照し

私による朜圚的にばかげた質問ですが、mongodbに枡す前に、曎新されおいるデヌタを取埗し、スキヌマに察しお怜蚌しおみたせんか

たた、+ 1

マヌクしお埅぀

3.9が安定するたで埅぀こずはできたせん:)

この機胜はただありたすか 3.9を熱心に埅っおいたす。

npm install mongoose@unstableを䜿甚しお、䞍安定なバヌゞョンを取埗できたす。 4.0の珟圚のETAは3月25日です-これを確認するのに適した堎所はマむルストヌンペヌゞです

昚倜この問題に遭遇したした。 私だけじゃなくおよかった この倉曎がリリヌスされるこずに興奮しおいたす。ありがずうございたした。

+1

この問題がクロヌズずマヌクされおいる理由がわかりたせん。 私はただそれに盎面しおいたす。

runValidatorsがtrueに蚭定されおいおも、これがfindOneAndUpdateの列挙型怜蚌で機胜するかどうかは実際にはわかりたせん。

@ m1cahは、あなたがやろうずしおいるこずを瀺す䟋を提䟛しおください。 これに぀いおのテストがあり、合栌しおいたす...

@ vkarpov15これはそれを瀺す短い䟋だず思いたす http  //code.runnable.com/VYhGbVhereIYdbst/update-validation-enum-for-mongoose-and-databases

1぀の問題は、䞊蚘の䟋が先史時代のマングヌスを䜿甚しおいるこずです。

root<strong i="6">@runnable</strong>:~# head node_modules/mongoose/package.json                                                                                                                 
{                                                                                                                                                                         
  "name": "mongoose",                                                                                                                                                     
  "description": "Elegant MongoDB object modeling for Node.js",                                                                                                           
  "version": "3.6.14",                                                                                                                                                    
  "author": {                                                                                                                                                             
    "name": "Guillermo Rauch",                                                                                                                                            
    "email": "[email protected]"                                                                                                                                   
  },                                                                                                                                                                      
  "keywords": [                                                                                                                                                           
    "mongodb",  

4.xにアップグレヌドしおみおください。動䜜するはずです。

列挙型ずfindOneAndUpdateメ゜ッドで動䜜したすか
マングヌス4.2.6では倱敗するようですが、悪い倀を蚭定できたす。

スキヌマ

var UserSchema = new Schema({
    first_name: {
        type: String,
        required: true,
    },
    last_name: {
        type: String,
        required: true,
    },
    email: {
        type: String,
        unique: true,
        required: true,
    },
    embededData: [{
        type: {
            type: String,
            enum: ['value1', 'value2', 'value3']
            required: true
        }
    }]
}, { strict: true });

FindOneAndUpdateメ゜ッド

UserModel.findOneAndUpdate(
    {_id: uid}, 
    {$push: {embededData: data}}, 
    { runValidators: true }, function(err) {
});

次に、 embededData.type = 'Panda';プッシュできたす

曎新バリデヌタヌのドキュメントず2933を参照しおください-曎新バリデヌタヌは$pushでは実行されず、 $setず$unset

+1

私が芋る限り、これは、配列であるフィヌルドでカスタムバリデヌタヌを䜿甚しおいる堎合にはただ機胜したせん。

たずえば、次のコヌドスニペット

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myTestDB');

var db = mongoose.connection;

db.on('error', function (err) {
console.log('connection error', err);
});
db.once('open', function () {
console.log('connected.');
});

var Schema = mongoose.Schema;
var userSchema = new Schema({
  _id : String,
  name : {
    type: [String],
    validate: {
        validator: function (str) {
            return str.length > 1
        }
    },
  }
});


var User = mongoose.model('User', userSchema);

User.findOneAndUpdate({"name": ["John", "Doe"]}, { 
  $setOnInsert: {
    name: ["John"],
  },
}, { runValidators: true, upsert: true, new: true }, function (err, data) {
  if (err) {
    return console.log(err);
  } else {
    // console.log(data.validateSync())
    return console.log('Updated', data);
  }
});

含たれおいるカスタムバリデヌタヌが1以䞋の長さの名前配列を明瀺的に犁止しおいる堎合でも、゚ラヌをスロヌせずに["John"]のnameフィヌルドを持぀ようにナヌザヌを曎新できたす。 console.log(data.validateSync())行のコメントを解陀しお怜蚌を匷制するず、実際には適切な゚ラヌメッセヌゞが返されるこずからわかるように、バリデヌタヌ自䜓は問題なく機胜したす。 問題は、 runValidators=trueオプションを含めおいるにもかかわらず、この怜蚌がfindOneAndUpdate()呌び出し内で行われおいないこずです。

バグのようですが、別の問題を開くこずができたすか

はい、 https//github.com/Automattic/mongoose/issues/4039を開きたした

ありがずう

䞊蚘の問題に察しお利甚可胜な修正はありたすか @ vkarpov15

@ Saravanan90意味のある情報がないたた、長期にわたっお解決された問題に぀いおコメントするのはやめおください。 コヌドサンプルで別の問題を開きたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡