【问题标题】:How can I save an empty array into mongodb using js如何使用 js 将空数组保存到 mongodb
【发布时间】: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


【解决方案1】:

将空数组传递给 Mongo 时,它们被解释为空文档,{}。 Zend Json 编码器会将它们解释为空数组 []。我知道无法判断哪个是正确的。 如果出现空数组,请尝试发布为

数组[null]; 而不是 Array[];

这会很好用

【讨论】:

    【解决方案2】:

    将空数组传递给 Mongo 时,它们被解释为空文档,{}。 Zend Json 编码器会将它们解释为空数组 []。我知道无法判断哪个是正确的。

    在我看来,实际的 php 数组(当为空时)被解释为 MongoDB 中的数组更合乎逻辑。虽然这需要其他东西来识别空文档,但它仍然比当前行为更合乎逻辑。

    一个可能的解决方案是在想要引入一个空对象时引入一个新对象 MongoEmptyObject(或使用 stdObj)。

    同时,一种解决方法是检测php中的空数组,并注入一个空值 $arr[0] = null; 那么这个对象会在 mongo 中被解释为一个空数组。

    解决方法在 PHP 和 mongo 控制台中都有效。问题:json 是否允许具有空值的数组?如果是这样,那么解决方法是另一个错误的迹象。

    PHP: if (is_array($value) && empty($value))

    { $value[0] = null; } Mongo 控制台:

    var b =

    {hej:"da", arr: [null]}

    db.test.save(b); db.test.find();

    {“_id”:“4a4b23adde08d50628564b12”,“hej”:“da”,“arr”:[]}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2019-11-21
      • 2019-09-29
      • 2018-06-02
      • 1970-01-01
      相关资源
      最近更新 更多