由于MongoDB 2.6.x中索引的硬限制为1024字节,因此我必须删除一个非常有用的复合索引,其中包含一个文本字段,该字段有时很长并且包含高Unicode字符,因此超出了字节限制。
我必须用单个字段上的散列索引替换它,迫使MongoDB打开BSON,检查散列索引之外的其他字段。
我想尝试删除这些超长的结果(因此我可以恢复原始的复合索引),但我不知道如何查询该字段的数据超过某个数据的位置字节数。有谁知道吗?
答案 0 :(得分:2)
到目前为止,我已经选择了这个选项......
我在我的数据中创建了一个新字段(这很不幸,因为它需要大量的IO)。该脚本遍历并设置每个文档的值。
db.Example.find({lb: {$exists: false}}).limit(200000).forEach(function (obj) {
var lengthBytes = encodeURIComponent(obj.text).replace(/%[A-F\d]{2}/g, 'U').length;
// print("id=" + obj._id + ";lenBytes=" + lengthBytes);
db.Example.update({ _id: obj._id }, {$set: { lb: NumberInt(lengthBytes)} });
});
我已完成一些抽查,其值与http://mothereff.in/byte-counter
相符然后我可以用:
查询长字符串 db.Example.find({lb: {$gt: 800}}).limit(20);
注意:NumberInt
强制Mongo将长度存储为int,否则将其存储为浮动