我正在使用mongoose(節點),輸出id而不是_id的最佳方式是什麼?MongoDB:輸出'id'而不是'_id'
回答
我在我的模型上創建一個toClient()方法,我這樣做。這也是重命名/刪除你不想要發送到客戶端的其他屬性的好去處:
Schema.method('toClient', function() {
var obj = this.toObject();
//Rename fields
obj.id = obj._id;
delete obj._id;
return obj;
});
我真的很新貓鼬,這看起來像我想要的。你怎麼稱呼這個toClient?通常我會做,找到(),然後獲取文檔對象,然後執行res.send(docs)。因此,在這種情況下,我是否要在每個文檔上調用res.write(docs [1] .toClient())?謝謝 – Johnny
這似乎不適合我 - 現在在Mongoose中做到這一點的方法改變了嗎? – outside2344
虛擬可能是你想要的。 – Leonidas
還有另外一個驅動程序,這是否http://alexeypetrushin.github.com/mongo-lite設置convertId
選項設置爲true。有關更多詳細信息,請參閱「默認設置&設置」部分。
鑑於您使用的是Mongoose,您可以使用'虛擬',這實質上是Mongoose創建的虛假字段。他們不存儲在數據庫中,他們只是在運行時填充:
// Duplicate the ID field.
Schema.virtual('id').get(function(){
return this._id.toHexString();
});
// Ensure virtual fields are serialised.
Schema.set('toJSON', {
virtuals: true
});
任何時間的toJSON叫你從這個架構創建模型,它包括了_id相匹配的「ID」字段由Mongo生成。同樣,你可以用同樣的方法設置toObject的行爲。
參見:
- http://mongoosejs.com/docs/api.html
- http://mongoosejs.com/docs/guide.html#toJSON
- http://mongoosejs.com/docs/guide.html#toObject
可以抽象成BaseSchema這一切你的模型,然後擴展/調用保持邏輯在一個地方。我在創建Ember/Node/Mongoose應用程序時編寫了上述內容,因爲Ember真的更喜歡使用'id'字段。
+1對我很好用 –
非常好的解決方案(+1)。我還會添加'Schema.set('toObject',{virtuals:true})'在使用'console.log(obj)'時能夠在輸出中看到虛擬。 – Tom
這使_id字段保持不變。我更喜歡變換解決方案,shakinfree提供的解決方案爲我工作。 –
//Transform
Schema.options.toJSON.transform = function (doc, ret, options) {
// remove the _id of every document before returning the result
ret.id = ret._id;
delete ret._id;
delete ret.__v;
}
有一個「Schema.options.toObject.transform」屬性做反向或者您也可以設定爲一個虛擬的ID。
感謝您的支持! –
以下是由@ user3087827提供的答案的替代版本。如果您發現schema.options.toJSON
是不確定的,那麼你可以使用:
schema.set('toJSON', {
transform: function (doc, ret, options) {
ret.id = ret._id;
delete ret._id;
delete ret.__v;
}
});
貓鼬V4.0的這個功能部分支持開箱的。不再需要手動添加@Pascal Zajac解釋的虛擬id
字段。
貓鼬分配每個模式的默認 一個ID虛擬的getter返回文檔_id字段強制轉換爲字符串,或在案件的ObjectID的 ,其十六進制串。如果您不希望將模式添加到 您的模式,您可以禁用它在模式 施工時間通過此選項。Source
然而,出口這一領域的JSON,它仍然需要使系列化虛擬領域:
Schema.set('toJSON', {
virtuals: true
});
早在v4.0之前就已經是真的了,但是OP想要返回* just * id(而不是_id)。只要告訴貓鼬包括虛擬身份證件就會返回兩者。 – neverfox
我創建了一個易於使用的plugin爲了這個目的,我申請我的所有項目和全球所有模式。它將_id
轉換爲id
並剝離__v
參數。
所以它轉換:
{
"_id": "400e8324a71d4410b9dc3980b5f8cdea",
"__v": 2,
"name": "Item A"
}
要更簡單和更清潔:
{
"id": "400e8324a71d4410b9dc3980b5f8cdea",
"name": "Item A"
}
用法作爲一個全球性的插件:
const mongoose = require('mongoose');
mongoose.plugin(require('meanie-mongoose-to-json'));
或特定模式:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const MySchema = new Schema({});
MySchema.plugin(require('meanie-mongoose-to-json'));
希望這可以幫助別人。
我用這個:
schema.set('toJSON', {
virtuals: true,
versionKey:false,
transform: function (doc, ret) { delete ret._id }
});
我認爲這將是巨大的,如果他們會自動抑制_id時虛函數是真實的。
您還可以在搜索要返回的項目時使用聚合函數。 $ project將允許您創建字段,您可以將其分配給_id。
<model>.aggregate([{$project: {_id: 0, id: '$_id'}], (err, res) => {
//
})
- 1. laravel mongodb如何在輸出中將_id更改爲id?
- 2. MongoDB:_id不能是數組
- 3. 如何輸出名稱而不是ID?
- 4. _id與_id MongoDB中
- 5. Backbone.js sents POST而不是PUT(mongoose set _id to id)
- 6. Mongodb - geospacial _id?
- 7. Java - MongoDB collection.find()_id
- 8. MongoDB是一個好主意,使用_id作爲實體ID
- 9. php輸出 而不是 -
- 10. MongoDB的:與特定ID,而不是生成的對象ID
- 11. 獲取名稱,而不是_id
- 12. 貓鼬 - 獲取_ids而不是用_id
- 13. C#MongoDb - 正確輸出ID字段?
- 14. 顯示對象ID而不是JSON輸出
- 15. 如何在mysql中輸出名稱而不是外鍵ID?
- 16. MongoDB _id超越9999999
- 17. MIPS輸出0.0而不是輸入
- 18. 店輸出文本,而不是列出
- 19. Html.Raw()輸出是&而不是&
- 20. Meteor MongoDB - 不能從API調用插入_id與_id
- 21. Rails的路線 - 嵌套單一的資源用:ID,而不是:資源名_ID
- 22. Mongodb更新。 setOnInsert Mod _id不允許
- 23. MongoDB .NET不會在upsert上生成_id
- 24. MongoDB的骨料$組「_id」爲不同的
- 25. hadoop mongodb連接器 - 輸出數據不是mongodb,但hdfs
- 26. Mongodb NULL而不是刪除
- 27. 在MongoDb中更改_id
- 28. Node.js mongodb無效_id值
- 29. Mongodb聚合,在$ group _id
- 30. Django模板和MongoDB _id
對於新的讀者:下面你會看到多個*不同的方法。在選擇之前閱讀所有內容是明智的,而不是盲目地接受或大多數選票。乾杯! – sshow