因此,我想创建一个基于客户端的分区模式,其中我将集合名称设置为function(),我的伪代码如下所示:
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
var ConvForUserSchema = new Schema({
user_id: Number,
conv_hash: String,
archived: Boolean,
unread: Boolean
}, function CollectionName() {
return (this.user_id % 10000);
});
通过moongose,这是否可能以任何方式使读和写都能按预期工作?
7条答案
按热度按时间klh5stk11#
您只需要使用您的动态名称声明模式模型,如下所示:
所以在代码中任何地方都可以这样做:
现在进入mongo shell并列出集合(使用mydb,然后显示集合),你会看到一个新的集合地址,前缀为uid。这样mongoose会为每个不同的用户uid创建一个新的集合地址。
pzfprimi2#
使用函式以动态方式取得模型。
然后利用函数得到动态模型
3bygqnnd3#
集合名称逻辑在整个Moongose代码库中都是硬编码的,这样客户端分区就不可能了。
我的解决方案是直接和蒙戈司机合作-
https://github.com/mongodb/node-mongodb-native
这被证明是伟大的,灵活的工作与驱动程序直接允许一切所需的和Moongose开销似乎没有增加太多在任何情况下。
8oomwypt4#
已实施:
xfb7svmp5#
Gomosoft的解决方案是可行的。它需要一些修正,但是这个想法很好用。上面的解决方案只在第一次使用时有效。如果你试图向同一个集合发送第二个请求,它会抛出一个错误,因为它试图覆盖已经定义的模型。所以我不得不如下调整它:
因为我正在检查myRating是否未定义,所以它只会创建一次此引用。因此不会发生错误。希望这能有所帮助。
bmp9r5qi6#
我补充Javier Gomez的答案,以给予Exis Zang的“OverwriteModelError:编译后无法覆盖xxx模型”问题。架构模型文件可以存储基于Singleton模式的动态模型数组。如果该模型已存在,请返回它,否则使用new创建它,存储它并返回它:
7cjasjjr7#