如何使用js将空数组保存到mongodb中

时间:2013-11-17 14:48:10

标签: javascript arrays node.js mongodb

基本上我把我的应用程序运行了但是我遇到了一个问题:如果我传递一个包含空数组的对象要保存,则该数组不会保存到数据库中。我不确定这是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的新手,所以它可能是我不知道的一个功能。

2 个答案:

答案 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”:[]}