【发布时间】:2013-11-30 16:10:27
【问题描述】:
基本上我让我的应用程序运行起来,但我遇到了一个问题:如果我传递一个包含要保存的空数组的对象,则该数组不会保存到数据库中。我不确定这是 js 或 mongo 驱动程序中的问题,但为了保存空数组,我需要像这样传递数组:products: ['']。
这是我的 mongo 文档的结构:
_id: ObjectId(...),
name: 'String',
subcategories: [
{
subcategory: 'string',
products: [
{
name: 'string'
price: integer
}
]
}
]
因此,在我的前端,我通过 ajax 调用将一个新对象推送到子类别数组中来获取整个文档。新对象如下所示:
{subcategory:'string', products:['']}
在我需要在数组中插入一个新对象之前,这可以正常工作:因为我已经抓取了整个对象,将新对象推送到数组中,前一个看起来像这样:
{subcategory: 'string'}
在此过程中丢失了对products:[] 数组的提及。
我该如何解决这个问题?我需要能够在我的对象中有空数组。
编辑
我在前端做了什么:用$.get 得到了返回的整个对象:
var obj =
_id: ObjectId(...),
name: 'String',
subcategories: [
{
subcategory: 'Subcategory1',
products: [
{
name: 'string'
price: integer
}
]
}
];
然后在前端我将新的对象类别推送到子类别数组中:
data.subcategories.push({subcategory: 'Subcategory2', products: ['']})
其中 subcat 是一个带有类别名称的字符串。在我的数据库上,我可以看到我已经成功添加了对象:
var obj =
_id: ObjectId(...),
name: 'String',
subcategories: [
{
subcategory: 'Subcategory1',
products: [
{
name: 'string'
price: integer
}
]
},
{
subcategory: 'Subcategory2'
products: []
}
];
问题是当我想添加另一个子类别时,前一个返回空:
var obj =
_id: ObjectId(...),
name: 'String',
subcategories: [
{
subcategory: 'Subcategory1',
products: [
{
name: 'string'
price: integer
}
]
},
{
subcategory: 'Subcategory2'
},
{
subcategory: 'Subcategory3'
products: []
},
];
因为在某些时候空数组已从对象中删除。就像我说的,我确实在前端修复了这个问题,所以错误玉石已经得到解决,但我仍然觉得奇怪的是 products: [] 被从文档中删除。
我是 MongoDb 和 node 的新手,更不用说我也是 JS 的新手,所以这很可能是我不知道的一个特性。
【问题讨论】:
-
您能解释一下为什么需要这样做吗? MongoDB 故意不保存“空”数据(即空数组)。我建议 NodeJS 中的客户端代码应该提供一个默认值。
-
空数组不是空数据。 products: null 或 products: not existing 和 products: [ ] 之间有很大的区别 - 其中一个是不同的 BSON 类型。可能存在错误 - OP,我不是 100% 清楚您的代码在做什么。当你说你“抓住了整个物体”时,你指的是哪个物体?
-
你能给出你用来更新文档的确切代码吗?听起来您可能没有将 update() 与 $push 一起使用,而是在客户端代码中本地推送?另外,您使用的是什么版本的驱动程序以及什么版本的 MongoDB?
-
好的,首先:我在前端遇到错误,因为 Jade 无法循环遍历未定义的对象(如果数组未保存 category.subcategories 重新调整为未定义)。我在前端使用条件进行了修复,因此错误消失了。 @AsyaKamsky 我在开头所做的是如上所述抓取整个对象,然后将更改推送到数组中。
-
你是说当你 save({_id:1, foo:[{bar:'x',arr:[]}]}) 最终保存在数据库中的是 {_id :1, foo:[{bar:'x'}]} 对吗?这是可重现的吗?
标签: javascript arrays node.js mongodb