gpt4 book ai didi

javascript - Mongodb递归搜索

转载 作者:IT老高 更新时间:2023-10-28 13:29:15 27 4
gpt4 key购买 nike

我需要搜索文档集合以及任何子文档,并在每次出现时将标题为“en”的字段重命名为“en-GB”,我已经尝试过这段代码,但不断收到 JavaScript 执行失败:RangeError: Maximum调用堆栈大小超出错误。问题是在不知道路径的情况下使用该函数搜索子文档。

remap = function (x) {
if (x.en){
db.products.update({_id:x._id}, {$rename:{"en":"en-GB"}}, false, true); }
for (var propt in x) {
if (Object.prototype.toString.call( x[propt] ) === '[object Array]' ||
Object.prototype.toString.call( x[propt] ) === '[object Object]'){
remap(x[propt]);
}
}

}

我也写过类似的东西,而是使用数组将它添加到队列中,但需要一种方法来保存子文档路径,例如“document.subdocument”,然后再次通过函数运行它以检查字段。

最佳答案

你可以试试下面的方法。

首先,只需对集合中的所有文档使用重命名:

db.products.update({}, {$rename:{"en":"en-GB"}}, false, true); 

没有理由在重映射函数中这样做。此外,您使用的语法意味着通过将 en 更新为 en-GB 来更新所有文档(不是特定文档)。

如果您只想更新单个特定文档,则需要通过 _id 指定文档,例如:

db.products.update({_id : x._id}, {$rename:{"en":"en-GB"}}, false, true); 

然后,修改你的 remap 函数以循环遍历每个文档的所有属性,并获取值并检查其类型:

var remap = function (x) {
for (var propt in x) {
var val = x[propt];
var type = Object.prototype.toString.call( val );
if (type === '[object Array]' || type === '[object Object]') {
remap(val);
}
}
};

它可以递归调用,如图所示。 但是,这不会重命名子对象的属性。这更复杂,您需要为每个传递完整文档,递归维护它,然后一次更新文档的所有属性(使用属性路径,如 "subobject.locale" 或重新保存整个文档)。数组可能更难就地执行,因为您需要删除数组中的对象,然后将其重新插入到具有新修改的相同索引处(或使用数组索引说明符)。如果你保存整个文档,你可以在原地修改它们,这样会更简单。

老实说,我现在会使用您最喜欢的编程语言而不是从 shell 来执行此操作。

关于javascript - Mongodb递归搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com