我正在致力于将统计计算从 php 迁移到 node.js。之前的开发者为每个客户端制作了一个集合,并且所有集合并不遵循相同的架构。
但是,我需要计算的部分在所有集合上都是相同的,所以我想做的是像这样的“不完整”模式:
S_logs.web = new mongoose.Schema({
/*
user_ip : String,
user_id : String,
user_agent : String,
*/
canal_id : String,
theme_id : String,
video_id : String,
time : Number,
/*
action : String,
is_newuser : String,
operator : String,
template : String,
catalogue : String,
*/
referer : String,
/*
from : String,
request : String,
smil : String,
smil_path : String
*/
}, {
collection: db_web
});
M_logs.web = mongoose.model(db_web, S_logs.web, db_web);
注释字段是仅存在于(以该名称或形式)一个集合中的字段。未注释的字段是我需要的字段,并且存在于所有集合中。
如果所有字段都未注释,则一切正常,但是当我注释掉这些字段时,即使我给出了集合的名称,似乎也无法识别集合。
我是否缺少允许我使用此类模式的标志/选项?或者我注定要为每个客户制作“所有字段”架构?
编辑:
当我谈到“不完整”模式时,更多的是“仅选择我知道存在于我不知道的所有字段中间的那些字段”,我不需要将数据放入集合中,这就是为什么我觉得奇怪MongoDB 没有这样的东西。
最佳答案
Mongoose 可以以“无模式”模式运行。这会产生一些后果,例如缺少每个字段的访问器,并且需要“显式”指定这些:
S_logs.web = new Schema({}, { strict: false });
M_logs.web = mongoose.model( db_web, S_logs.web, db_web );
这意味着当您访问文档中的“字段/属性”时,您需要使用 .get()
方法而不是自动生成的访问器,例如:
M_logs.web.find({}, function(err,logs) {
logs.forEach(function(log) {
var canal_id = log.get("canal_id");
// do something with that value
});
});
如果所有文档不符合一致的模式模式,那么这很有用,但要理解,在处理这种级别的“多态性”时,自动生成的对象不能具有相同的方便的接口(interface),因为它不被 Mongoose 。
关于javascript - 使用 mongoose 中现有集合的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25605406/