在mongoose中使用现有集合的一部分

时间:2014-09-01 11:59:49

标签: javascript node.js mongodb mongoose

我正在努力将stats calcul从php迁移到node.js.上一个developer为每个客户端创建了一个集合,并且所有集合都不遵循相同的模式。

然而,我需要的calcul部分在所有集合中都是相同的,所以我想要做的是一个" uncomplete"这样的架构:

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没有这样的东西。

1 个答案:

答案 0 :(得分:1)

猫鼬可以采用“无模式”的方式行事。模式。存在一些后果,例如缺少每个字段的访问者,并且需要明确指定"明确"虽然:

 S_logs.web = new Schema({}, { strict: false });

 M_logs.web = mongoose.model( db_web, S_logs.web, db_web );

这意味着当您访问"字段/属性时#34;在您的文档中,您需要使用.get()方法而不是自动生成的访问器,例如:

 M_logs.web.find({}, function(err,logs) {
     logs.forEach(function(log) {
         var canal_id = log.get("canal_id");
         // do something with that value
     });
 });

如果所有文档都不符合一致的模式模式,这很有用,但要理解自动生成的对象在处理此级别的多态性时不能具有相同的方便界面。因为它不是mongoose支持的东西。