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
表达式。