如何在不选择模式配置参数的情况下使用 mongoose 在 MongoDB 模式实例化中的关联数组/对象中执行 foreach?

Posted

技术标签:

【中文标题】如何在不选择模式配置参数的情况下使用 mongoose 在 MongoDB 模式实例化中的关联数组/对象中执行 foreach?【英文标题】:How to perform a foreach in an associative array/object in a MongoDB schema instantiation using mongoose without selecting schema config parameters? 【发布时间】:2013-12-08 22:52:54 【问题描述】:

在谷歌上搜索了几个小时,并没有真正找到可靠的答案。也许我使用了错误的搜索参数?不管怎样,我去:

我是 MongoDB 新手,我正在尝试在保存模式实例之前更改它的值。我知道有很多关于使用“保存”中间件的帖子,但我认为它不会解决我的问题。

我有这样的架构设计:

var fooSchema = new mongoose.Schema(
    data:
        type1: 
            objectfoo: [],
            objectbar: []
        ;
        type2: 
            objectxxx: [],
            objectyyy: []
        ;
    
);

这不是一个无限的对象,所以我不想做一些花哨的事情,比如将它链接到另一个架构或集合。

我想做这样的事情:

for(i in data)
    for(j in data[i])
        data[i][j].push(val);
    

但是,它会给我一个“未定义的错误”或者说对象不存在并出错。我在第一个 for 循环中做了一个console.log,结果证明 for(...in...) 不仅选择了数据字段,而且还选择了架构实例化中的配置字段,例如:

$__delta
$__version
increment
$__where
remove
model
$__buildDoc
init
$__storeShard
toJSON
[Function]
[Function]

所以我猜代码可以工作,它只是在遇到这些其他属性之一并尝试将值压入时中断。

请注意,“type1”和“objectfoo”需要在关联类型的数组中,因为我需要按名称引用它们,所以我不能使用普通数组并循环遍历array.length。我可能完全错了,因为我是 MongoDB 新手,所以如果有更有效的方法可以做到这一点,请告诉。

我在想有一种方法可以只引用对象的数据字段而不选择其他配置内容,但是搜索了几个小时后我找不到它。

提前致谢。

编辑:为了清楚起见:我已经实例化了它:

var Foo = mongoose.model('foo', fooSchema);
var newfoo = new Foo();

所以当我这样做时:

for(i in newfoo.data)
    console.log(newfoo.data[i]);

它会打印出所有的配置内容。

【问题讨论】:

你真的从模式中创建了一个模型吗? var m = mongoose.Model('MyModel', fooSchema) 是的。一切都创建好了。让我编辑帖子以更清晰。 【参考方案1】:

当您需要将模型数据转换为没有任何额外字段或函数的普通对象时,请在模型数据上调用 toObject()

for(i in data.toObject())
    for(j in data[i].toObject())
        data[i][j].push(val);
    

【讨论】:

toObject() 成功了。非常感谢。这是猫鼬函数还是javascript原生函数? @PGT 这是一个Mongoose函数,见mongoosejs.com/docs/api.html#document_Document-toObject 谢谢!这解决了我使用 Express 车把显示数据的问题

以上是关于如何在不选择模式配置参数的情况下使用 mongoose 在 MongoDB 模式实例化中的关联数组/对象中执行 foreach?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不创建数组的情况下使用 NgFor 来生成矩阵 UI 模式

在不使用 JavaScript 的情况下,如何在选择字段集中时使 Enter 键提交表单?

如何在不使用 _layouts 目录的情况下配置自定义页面?

如何在不知道 NA 值模式的情况下快速将列转换为数字

如何在不更新整个固件的情况下使嵌入式系统可配置

如何在不使用按钮的情况下切换引导模式?