[英]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.