如何在不在 MongoDB 中创建集合的情况下创建 Mongoose 模型?
Posted
技术标签:
【中文标题】如何在不在 MongoDB 中创建集合的情况下创建 Mongoose 模型?【英文标题】:How to create a Mongoose model without creating a collection in MongoDB? 【发布时间】:2016-12-05 17:54:38 【问题描述】:我只想在 MongoDB 中拥有一个 versioneditems
集合,但我需要同时注册 VersionedItem
模型和 ItemPatch
模型,因为我需要创建 ItemPatch
es 来填充 VersionedItem
。
不会有单独的ItemPatch
文档(它们嵌入在VersionedItem
中)。除了在 MongoDB 中创建了一个额外的集合之外,下面的代码可以正常工作:
src/models/versionedItemFactory.js
const VersionedItemSchema = require('../schemas/VersionedItem');
module.exports = (db) =>
var VersionedItemModel = db.model('VersionedItem', VersionedItemSchema);
return VersionedItemModel;
;
src/models/itemPatchFactory.js
const ItemPatchSchema = require('../schemas/ItemPatch');
module.exports = (db) =>
var ItemPatchModel = db.model('ItemPatch', ItemPatchSchema);
return ItemPatchModel;
;
src/schemas/util/asPatch.js
var mongoose = require('mongoose');
module.exports = function _asPatch(schema)
return new mongoose.Schema(
createdAt: type: Date, default: Date.now ,
jsonPatch:
op: type: String, default: 'add' ,
path: type: String, default: '' ,
value: type: schema
);
;
src/schemas/Item.js
var mongoose = require('mongoose');
module.exports = new mongoose.Schema(
title: type: String, index: true ,
content: type: String ,
type: type: String, default: 'txt'
, _id: false );
src/schemas/ItemPatch.js
var asPatch = require('./util/asPatch');
var ItemSchema = require('./Item');
module.exports = asPatch(ItemSchema);
src/schemas/VersionedItem.js
var mongoose = require('mongoose');
var ItemPatchSchema = require('./ItemPatch');
module.exports = new mongoose.Schema(
createdAt: type: Date, default: Date.now ,
patches: [
createdAt: type: Date, default: Date.now ,
jsonPatch: type: ItemPatchSchema
]
);
然后像这样注册:
db.once('open', function()
require('./models/itemPatchFactory')(db);
require('./models/versionedItemFactory')(db);
);
我需要通过itemPatchFactory
注册ItemPatch
模型,因为我希望能够像这样填充版本化项目:
var itemPatch = new db.models.ItemPatch(
jsonPatch:
op: 'add',
path: '',
value:
title: 'This is a title',
content: 'This is content',
type: 'txt'
);
var itemPatch2 = new db.models.ItemPatch(
jsonPatch:
value:
title: 'This is a title 2',
content: 'This is content 2'
);
var versionedSomething = new db.models.VersionedItem();
versionedSomething.patches.push(itemPatch);
versionedSomething.patches.push(itemPatch2);
versionedSomething.save(function (err, result)
if (err) throw err;
console.log('result:', result);
);
这成功创建了其中包含 2 个补丁的版本化项目,但在 MongoDB 中创建了一个(空的)itempatches
集合,我想避免这种情况。
【问题讨论】:
我也想要这个。 【参考方案1】:您可以使用 mongoose Schema 选项 - autoCreate: false, autoIndex: false 来不创建 mongodb 集合。
[1]https://mongoosejs.com/docs/guide.html#autoIndex
【讨论】:
【参考方案2】:如果没有相应的集合,您将无法创建 Model
,但我认为您实际上并不需要这样做。
您可以简单地为孩子创建一个 javascript 对象并将其推送到父集合。请参阅 Mongoose 文档 (https://mongoosejs.com/docs/subdocs.html) 中的这个 sn-p
var Parent = mongoose.model('Parent');
var parent = new Parent;
// create a comment
parent.children.push( name: 'Liesl' );
var subdoc = parent.children[0];
console.log(subdoc) // _id: '501d86090d371bab2c0341c5', name: 'Liesl'
subdoc.isNew; // true
parent.save(function (err)
if (err) return handleError(err)
console.log('Success!');
);
但是,您可以为子文档创建Schema
。这将让您在从 parent 集合中读取/写入时强制执行结构:
var childSchema = new Schema( name: 'string' );
var parentSchema = new Schema(
// Array of subdocuments
children: [childSchema],
// Single nested subdocuments. Caveat: single nested subdocs only work
// in mongoose >= 4.2.0
child: childSchema
);
【讨论】:
以上是关于如何在不在 MongoDB 中创建集合的情况下创建 Mongoose 模型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Robo 3T(原 Robomongo)中创建 Mongodb 索引?