有没有办法根据特定字段的字节长度查询Mongodb?

时间:2014-08-18 09:53:58

标签: mongodb mongodb-query

由于MongoDB 2.6.x中索引的硬限制为1024字节,因此我必须删除一个非常有用的复合索引,其中包含一个文本字段,该字段有时很长并且包含高Unicode字符,因此超出了字节限制。

我必须用单个字段上的散列索引替换它,迫使MongoDB打开BSON,检查散列索引之外的其他字段。

我想尝试删除这些超长的结果(因此我可以恢复原始的复合索引),但我不知道如何查询该字段的数据超过某个数据的位置字节数。有谁知道吗?

1 个答案:

答案 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,否则将其存储为浮动