繁体   English   中英

如何从数组中拉出元素,其中元素的字符串长度>较大?

[英]How to $pull elements from an array, $where elements' string length > a large number?

而旧的斜线转义错误为我们留下了一些混乱的数据,如下所示:

{
    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查询查找suggestion字符串长于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”标签即可获得SO以正确设置代码格式)

问题注释中指出的简单解决方案应该有效。 它确实适用于测试案例,可以重现原始问题。 正则表达式可以匹配大字符串,那里没有特殊限制。

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);
});

它运行缓慢,但是在这种情况下,这并不是真正的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM