Javascript 如何从数组中$pull元素,$where元素';字符串长度>;大量?
旧的斜杠逃逸错误给我们留下了一些混乱的数据,比如:Javascript 如何从数组中$pull元素,$where元素';字符串长度>;大量?,javascript,mongodb,Javascript,Mongodb,旧的斜杠逃逸错误给我们留下了一些混乱的数据,比如: { suggestions: [ "ok", "not ok /////////// ... 10s of KBs of this ... //////", ] } 我只想从数组中取出那些坏值。我的第一个想法是基于匹配4个“/”字符的正则表达式$pull,但正则表达式似乎不适用于大字符串: db.notes.count({suggestions: /\/\/\/\//}) // returns
{
suggestions: [
"ok",
"not ok /////////// ... 10s of KBs of this ... //////",
]
}
我只想从数组中取出那些坏值。我的第一个想法是基于匹配4个“/”字符的正则表达式$pull
,但正则表达式似乎不适用于大字符串:
db.notes.count({suggestions: /\/\/\/\//}) // returns 0
db.notes.count({suggestions: {$regex: "////"}}) // returns 0
我的下一个想法是使用$where
查询来查找包含建议
字符串且长度超过1000的文档。该查询有效:
db.notes.count({
suggestions: {$exists: true},
$where: function() {
return !!this.suggestions.filter(function (item) {
return (item || "").length > 1000;
}).length
}
})
// returns a plausible number
但是,$where
查询不能用作$pull
更新中的条件
db.notes.update({
suggestions: {$exists: true},
}, {
$pull: {
suggestions: {
$where: function() {
return !!this.suggestions.filter(function (item) {
return (item || "").length > 1000;
}).length
}
}
}
})
投掷
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 81,
"errmsg" : "no context for parsing $where"
}
})
我的点子快用完了。我是否需要对整个集合进行迭代,并对每个文档分别执行$set:{suggestions:suggestions.filter(…)}
?在MongoDB中,没有更好的方法来清除大字符串数组中的坏值吗
(我只是添加了“javascript”标记,以便正确格式化代码)问题注释中指出的简单解决方案应该有效。它确实与一个测试用例一起工作,这个测试用例是对原始问题的再创造。正则表达式可以匹配大字符串,没有特殊限制
db.notes.updateOne({suggestions: /\/\//}, { "$pull": {suggestions: /\/\//}})
因为这对我不起作用,所以我最终选择了问题所讨论的内容:通过基于字符串长度过滤数组元素来分别更新所有文档:
db.notes.find({
suggestions: {$exists: true}
}).forEach(function(doc) {
doc.suggestions = doc.suggestions.filter(function(item) {
return (item || "").length <= 1000;
}); db.notes.save(doc);
});
db.notes.find({
建议:{$exists:true}
}).forEach(功能(文档){
doc.suggestions=doc.suggestions.filter(函数(项){
return(item | |“”)。长度需要从数组中删除多少个元素?从每个数组中删除的元素数少于20个。通常为1。另外db.notes.count({建议:/\/\/})
应返回带有/
的文档数,无论字符串长度如何。对于大字符串,应使用updateOne()
方法的筛选器参数:db.notes.updateOne({建议:/\/\/},{“$pull”:{建议:/\/})
使用520000
字符测试string我同意@user3100115的观点,这里的方法应该是“匹配元素”,而不是试图“匹配元素的大小”。无论如何,$where
的JavaScript表达式不能处理“单个数组元素”,甚至逻辑也没有尝试这样做,因为它仍然无法通过$pull
识别要删除的数组成员,而只是告诉您数组“包含”与条件相匹配的内容。请根据$elemMatch
的参数来考虑$pull
,由于同样的原因,您也无法在其中应用$where
表达式。