Javascript 如何使用js将空数组保存到mongodb中
基本上,我让我的应用程序运行起来,但我遇到了一个问题:如果我传递了一个包含要保存的空数组的对象,那么该数组不会保存到数据库中。我不确定这在js或mongo驱动程序中是否有问题,但为了保存空数组,我需要像这样传递数组:Javascript 如何使用js将空数组保存到mongodb中,javascript,arrays,node.js,mongodb,Javascript,Arrays,Node.js,Mongodb,基本上,我让我的应用程序运行起来,但我遇到了一个问题:如果我传递了一个包含要保存的空数组的对象,那么该数组不会保存到数据库中。我不确定这在js或mongo驱动程序中是否有问题,但为了保存空数组,我需要像这样传递数组:products:[''] 这是我的mongo文档的结构: _id: ObjectId(...), name: 'String', subcategories: [ { subcategory: 'string', products: [
products:['']
这是我的mongo文档的结构:
_id: ObjectId(...),
name: 'String',
subcategories: [
{
subcategory: 'string',
products: [
{
name: 'string'
price: integer
}
]
}
]
因此,在我的前端,我通过一个ajax调用将一个新对象推到子类别数组中来获取整个文档。新对象如下所示:
{子类别:'string',产品:['']}
在我需要在数组中插入一个新对象之前,这一切都正常:因为我抓取了整个对象,将新对象推到数组中,前一个看起来像这样:
{subcategory:'string'}
在过程中失去了对产品的提及:[
阵列
我怎样才能避开这件事?我需要能够在我的对象中有空数组
编辑
我在前端所做的:使用$获取整个对象。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: []
},
];
因为在某个时刻,空数组已从对象中移除。正如我所说,我确实在前端解决了这个问题,因此jade抛出的错误已经得到了解决,但我仍然觉得奇怪的是,产品:[]
正在从文档中删除
我不熟悉MongoDb和node,更不用说我也不熟悉JS,所以这可能是我不知道的一个特性。将空数组传递给Mongo时,它们被解释为空文档,{}。Zend Json编码器将它们解释为空数组[]。我知道不可能分辨出哪一个是正确的。 如果数组为空,请尝试作为发布 数组[null]; 而不是数组[]强>
当将空数组传递给Mongo时,这将正常工作,因为它们被解释为空文档,{}。Zend Json编码器将它们解释为空数组[]。我知道不可能分辨出哪一个是正确的 在我看来,在MongoDB中将实际的php数组(当为空时)解释为数组更符合逻辑。尽管这将需要其他东西来识别空文档,但它仍然比当前的行为更符合逻辑 一种可能的解决方案是,只要想引入一个空对象,就引入一个新对象MongoEmptyObject(或使用stdObj) 同时,解决方法是在php中检测空数组,并注入null值$arr[0]=null; 然后在mongo中将对象解释为空数组 该解决方案在PHP和mongo控制台中都可以使用。问题:json是否允许使用空值的数组?如果是这样,那么解决方法就是另一个bug的标志 PHP: if(is_数组($value)&&empty($value)) {$value[0]=null;} Mongo控制台: 变量b= {hej:“da”,arr:[null]} db.test.save(b); db.test.find()
{“_id”:“4a4b23adde08d50628564b12”,“hej”:“da”,“arr”:[]}您能解释一下为什么需要这样做吗?MongoDB故意不保存“空”数据(空数组就是这样)。我建议NodeJS中的客户端代码应该提供一个默认值。空数组不是空数据。products:null或products:not existing与products:[]之间有很大的区别,其中之一是不同的BSON类型。有可能存在bug-OP,我并不完全清楚你的代码在做什么。当你说你“抓取了整个对象”时,你指的是哪个对象?你能给出更新文档所用的确切代码吗?听起来您可能没有将update()与$push一起使用,而是在客户端代码中本地推送?另外,您使用的驱动程序的版本是什么,MongoDB的版本是什么?好的,首先,我在前端遇到一个错误,因为Jade无法循环通过一个未定义的对象(如果数组未保存category.subcategories,则被重新调整为未定义)。我在前端使用了一个条件进行了修复,因此错误消失了@AsyaKamsky我在from-end中所做的是按照上面所述抓取整个对象,然后将更改推送到数组中?这是可复制的吗?