簡體   English   中英

是否有將基於字符串的JSON轉換為Mongoose Schema對象實例的本機功能?

[英]Is there a native feature to convert string based JSON into Mongoose Schema object instance?

我正在使用Express,我正在尋找一種方便的方法來轉換這種對象(來自請求req.body.myObject ):

{
  "name": "Foo",
  "someNumber": "23",
  "someBoolean": "on"
}

進入這個Schema的一個實例:

var myObjectSchema = new Schema({
    name: String,
    someNumber: Number,
    someBoolean: Boolean
});

請注意,第一個對象來自請求,因此完全由Strings完成。

有沒有一些很好的方法來實現這一目標? 如果沒有,您對如何將此功能實現為中間件有任何建議嗎?

通過引用這個線程Mongoose:直接將JS對象插入db我發現是的,這是一個內置的功能。

您只需構建一個新模型,將請求值(來自表單)作為參數傳遞:

function add(req, res){
    new Contact(req.body.contact).save(function(err){
        console.log("Item added");
        res.send();
    });
};

它會自動為您轉換內容!

我知道這個答案已被接受,但我想指出,貓鼬為你照顧大部分演員......大多數時候。 雖然mongoose這樣做很方便,但它抽象了mongo的真實行為。 例如,mongoose允許你這樣做:

PersonModel.findById("4cdf00000000000000007822", ...);

但是,如果您嘗試直接查詢數據庫(沒有mongoose),這將無效

PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);

這是因為ObjectIds不是字符串......它們是對象。 在內部,mongoose將該字符串轉換為ObjectId,然后對數據庫執行查詢,以便最終查詢看起來像這樣:

PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);

此外,模式中的每個路徑都有一個“腳輪”方法。 這是一種私有方法,但在您需要它時它會非常方便。 請注意,下面描述的caster方法是未經修改的,並且可以在沒有警告的情況下進行更改。 使用您自己承擔風險 (抱歉大喊大叫):

// Use PersonModel.schema.paths() to get all paths and loop over them if you want
var key = "name";
var pathObj = PersonModel.schema.path( key );
if( !pathObj ) pathObj = PersonModel.schema.virtualpath( key );
if( !pathObj ) { /* not found: return, continue, exit, whatever */ }

// UNDOCUMENTED: USE AT YOUR OWN RISK
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast( req.body.name );

為什么我知道這個? 因為如果你想使用mongo的一些更高級的功能,比如聚合,你需要在構建管道時投射你自己的值。 我還需要為使​​用$in運算符的某些查詢手動轉換值...也許這不再需要了。 重點是,如果您在獲得預期結果時遇到問題,請嘗試自己投射值。

如果模式是靜態的,理論上可以采用惰性,非復雜的方式,只需硬編碼值而不是傳遞對象本身:

var someObject = {
    name: "Foo",
    someNumber: "23",
    someBoolean: "on"
}

var myObjectSchema = new Schema({
    name: someObject.name,
    someNumber: parseInt(someObject.someNumber, 10),
    someBoolean: (someObject.someBoolean == "on")
});

可能不是你想要的答案,但如果沒有更好的東西可能需要考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM