MongoDb:使用fifo策略和其他一些条件在对象内部保持固定长度的数组?

Dhr*_*hak 2 mongodb

我有一些更新的脚本,mongoDb记录如下所示:

{ "_id" : "c12345", "arr" : [
        {
                "i" : 270099850,
                "a" : 772,

        },
        {
                "i" : 286855630,
                "a" : 622,

        }
] }
Run Code Online (Sandbox Code Playgroud)

脚本在对象的"arr"数组中追加元素,使用"pushAll",它工作得很好并且非常快.

我的要求:1.继续修改这些对象,但一旦arr的大小超过1000就处理它们.

  1. 当arr超过1000时,我选择一些重要记录,丢弃一些不太重要的记录,丢弃一些旧记录,并将arr的大小减小到500.

当前实现:1.脚本A从某处获取一些数据,并使用"_id"字段在另一个集合中查找该对象,并将该数据附加到"arr"数组中.

  1. 找到元素时的相同脚本,检查"arr"的大小,如果小于1000,它会正常追加到arr,否则继续处理通过查找修改的PHP对象,修改它,并使用"更新mongo记录"组".

当前的瓶颈:1.我希望更新脚本运行得非常快.Upsert很快,但每条记录的查找和修改操作都比较慢.

想法:1.不要在脚本中处理EXCEEDED项,而是在对象中设置bool标志,并使用单独的Data Cleaner脚本处理它.(但这也要求我在做UPSERT之前找到对象).

  1. 总是在对象中维护一个COUNT变量,它存储当前长度"arr",并在Data cleaner脚本中使用它,它清除通过mongodb查询"count"> 1000获取的所有对象.(因为mongodb不允许使用$ size运算符有范围,目前只有相同的条件,我需要有自己的COUNT计数器)

您可以建议任何其他清洁有效的想法?谢谢 .

And*_*ett 7

在mongo的2.3.2版本中添加了一个新功能.现在有一个$ slice可用于将数组保持为固定大小.

例如:

t.update( {_id:7}, { $push: { x: { $each: [ {a:{b:3}} ], $slice:-2, $sort: {'a.b':1} } } } )
Run Code Online (Sandbox Code Playgroud)