我正在尝试在我的某个模型中使用“可选”嵌套文档。这是一个示例模式
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模式吗?
我需要
答案 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(...)
使用方法