此问题无效。
参见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/