javascript - 如何使 Node.js MongoDB 遵循对象引用?

标签 javascript arrays node.js mongodb reference

此问题无效。

参见my comment .

<小时/>

当您在 JavaScript 中构建具有多维数组的复杂对象时,MongoDB 不会存储任何技术上作为引用的数组。 MongoDB 不遵循引用并将数据存储在文档中。

有办法强制执行吗?

<小时/>

例如,一个对象包含一个名为products数组。每个产品都有一个名为 suppliers 的数组。每个 vendor 都有一个名为 shipments 的数组。

该对象是动态创建的,因此子数组是对父对象中实际数组的引用(通过 JavaScript 设计)。

只有第一个数组存储在 MongoDB 中,子域被忽略。

为了解决这个问题,我必须克隆整个对象。例如:jQuery.extend(true, {}, object);。但这可能需要一秒钟,这是很长的时间,我觉得没有必要。

如何将该对象及其引用提供给 MongoDB?有没有更快的方法来克隆对象并删除引用?还有其他解决办法吗?

我正在专门寻找这种情况。不是关于如何重组我的数据的想法。

<小时/>

在内部,javascript 会创建对所创建的每个数组或对象的引用。如果将该数组分配给对象值,则会分配内存引用;不是实际内容。

主要对象

{
    a : 33,
    lot : 52,
    of : true,
    data : false,
    products : [Array] (id=115)
}

产品

products : [
    {
        more : true,
        data : false,
        suppliers : [Array] (id=612)
    },
    {},
    {},
    //...
]

vendor

suppliers : [
    {
        even : null,
        more : 52,
        data : false,
        shipments : [Array] (id=854)
    },
    {},
    {},
    //...
]

等等

第一个数组被插入到MongoDB中;其余部分缺失。

展平后(jQuery.extend),如下所示:

{
    a : 33,
    lot : 52,
    of : true,
    data : false,
    products : [
        {
            more : true,
            data : false,
            suppliers : [
                {
                    even : null,
                    more : 52,
                    data : false,
                    shipments : [
                        {
                            some : 'foo',
                            more : 'bar',
                            data : false
                        },
                        {},
                        {},
                        //...
                    ]
                },
                {},
                {},
                //...
            ]
        },
        {},
        {},
        //...
    ],
}

文档毫无问题地插入到 MongoDB 中。

最佳答案

这就是浅拷贝与深拷贝的问题。

虽然您可以在运行时遍历对象中的每个键并检查数组(或数组的数组等),但这可能不是最高性能的。如果您已经知道对象结构,那么您应该能够构建深拷贝。

function Foo() {
     this.prop = "someKey";
     this.arr2d = [[0],[1],[2]];
}

Foo.prototype.getDeepCopy = function() {
    var self = this;
    return {
        prop: self.prop,
        arr2d: function() {
            var arr = [];
            for ( var i = 0; i < self.arr2d.length; i++ ) {
                var _a = [];
                for ( var j = 0; j < self.arr2d[i].length; j++ ) {
                    _a[j] = self.arr2d[i][j];
                }
                arr[i] = _a;
            }
            return arr;
        }()
    };
}

您还可以使用接受对象引用或文字而不是使用原型(prototype)的函数来执行此操作。

function deepCopy(obj) {
    return {
        prop:obj.prop,
        arr2d:function() {...}()
    };
}

深拷贝仍然需要迭代对象结构,但它会比这样做更快

var copy = JSON.parse(JSON.stringify(obj));

编辑:如果不清楚,您将必须构建一个没有引用的数据 - 这意味着要么通过深拷贝重建它,要么首先从字面上构建它。

关于javascript - 如何使 Node.js MongoDB 遵循对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33000970/

相关文章:

javascript - pubsub 订阅者错误 : Max message size exceeded

javascript - 基于表达式的解构对象

javascript - Javascript可以判断PNG还是JPG吗?

javascript - 在javascript中将单词拆分为音节

node.js - 在Socket.IO中, 'heartbeat'是可以用来触发其他 Action 的事件吗?

json - 在 NodeJS 中将多个文件中的 JSON 对象插入到 MongoDB 的最有效方法

javascript - React js如何从组件外部发布axios

javascript - 任何人都可以用一个例子来解释 javascript 中的 namespace 吗?

c - 如何在另一个数组中的用户指定位置插入一个数组并获取结果数组?

javascript - 如何正确地将数组推送到另一个数组?