Mongoose可选的嵌套属性 - 检查null / undefined?

时间:2015-01-08 23:13:33

标签: node.js mongodb mongoose

我正在尝试在我的某个模型中使用“可选”嵌套文档。这是一个示例模式

var ThingSchema = mongoose.Schema({
  name: String,
  info: {
      'date' : { type: Date },
      'code' : { type: String },
      'details' : { type: Object }
  }
})
var Thing = mongoose.model('Thing', ThingSchema);

在这种情况下,我希望“info”属性可能为null(不是必需的),并且将具有检查信息是否为null / undefined的应用程序逻辑。

不幸的是,即使在mongo的文档中未定义'info'属性,mongoose仍然会返回检索到的模型中'info'字段的对象。

例如,当我运行此代码时,'info'对象填充了一个(空)对象。

var thingOne = new Thing({
  name: "First Thing"
})

thingOne.save(function(err, savedThing) {
    if (savedThing.info) {
        //This runs, even though the 'info' property 
        //of the document in mongo is undefined
        console.log("Has info!");
    }
    else console.log("No info!");
})

我尝试定义ThingSchema,如下所示

var ThingSchema = mongoose.Schema({
  name: String,
  info: {
    type: {
      'date' : { type: Date },
      'code' : { type: String },
      'details' : { type: Object }
    },
    required: false

  }
})

这允许我从数据库中检索未定义的“info”属性,但这样做可以让我打破“info”架构并添加随机属性,如

savedThing.info.somePropertyThatDoesNotExistInTheSchema = "this shouldn't be here";

然后将持久保存到数据库。此外,如果“info”属性包含任何其他嵌套文档,更新它们不会将Thing模型标记为脏,这意味着我必须手动将路径标记为已修改(通过thing.markModified(path))

有没有办法完成我想要做的事情?对此有什么最佳做法吗?我只是完全错误地使用mongoose模式吗?

我需要

  1. 检索Thing架构的空“info”属性
  2. 有一些方法可以测试mongo中的“info”属性是否实际为null,即使mongoose在检索时给它一个值。

3 个答案:

答案 0 :(得分:0)

Mongoose会将任何返回的文档投射到用于定义模型的模式。

关于持久保存到数据库的任意路径,您可以使用strict抛出错误而不是静默删除它(默认情况下应该这样做)。

答案 1 :(得分:0)

本机mongodb驱动程序中有连接选项#!/usr/bin/env python3 # coding: utf-8 from datetime import datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Float, DateTime engine = create_engine('sqlite://', echo=True) Session = sessionmaker(bind=engine) Base = declarative_base() class Sample(Base): __tablename__ = 'samples' id = Column(Integer, primary_key=True, autoincrement=True) value = Column(Float, nullable=False) imported_on = Column(DateTime, nullable=False, default=datetime.utcnow) if __name__ == "__main__": import pandas as pd Sample.__table__.create(engine, checkfirst=True) df = pd.DataFrame({'value': [1, 2, 3]}) df.to_sql( name=Sample.__table__.name, con=engine, if_exists='append', index=False, ) ,可以解决此问题。 https://mongodb.github.io/node-mongodb-native/2.1/reference/connecting/connection-settings/

答案 2 :(得分:0)

尝试使用

const Thing = mongoose.model('Thing', ThingSchema)

Thing.create({ name: "First Thing" })

代替

var thingOne = new Thing({ name: "First Thing" })
thingOne.save(...)

使用方法

mongoosejs.com/...model_Model.create