基本上我把我的应用程序运行了但是我遇到了一个问题:如果我传递一个包含空数组的对象要保存,则该数组不会保存到数据库中。我不确定这是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: []
},
];
因为在某些时候从对象中删除了空数组。就像我说的那样,我确实在前端解决了这个问题,因此错误的jade抛出已经解决了,但我仍然觉得奇怪的是products: []
正从文档中删除。
我是MongoDb和节点的新手,更不用说我也是JS的新手,所以它可能是我不知道的一个功能。
答案 0 :(得分:1)
将空数组传递给Mongo时,它们被解释为空文档{}。 Zend Json编码器会将它们解释为空数组[]。我了解无法确定哪一个是正确的。 如果是空数组,请尝试以
形式发布Array [null]; 而不是Array [];
这会很好
答案 1 :(得分:0)
将空数组传递给Mongo时,它们被解释为空文档{}。 Zend Json编码器会将它们解释为空数组[]。我了解无法确定哪一个是正确的。
在我看来,将实际的php数组(当为空时)解释为MongoDB中的数组更合乎逻辑。尽管这将需要其他一些方法来识别空文档,但与当前行为相比仍然更具逻辑性。
一种可行的解决方案是,每当要引入一个空对象时,引入一个新对象MongoEmptyObject(或使用stdObj)。
同时,一种解决方法是检测php中的空数组,并注入空值$ arr [0] = null; 然后该对象将在mongo中解释为空数组。
该解决方法在PHP和mongo控制台中均有效。问题:json是否允许使用具有空值的数组?如果是这样,则解决方法是另一个错误的征兆。
PHP: 如果(is_array($ value)&&空($ value))
{$ value [0] = null; } Mongo控制台:
var b =
{hej:“ da”,arr:[null]}
db.test.save(b); db.test.find();
{“ _ id”:“ 4a4b23adde08d50628564b12”,“ hej”:“ da”,“ arr”:[]}