MongoDB在任意数组位置递增

时间:2013-11-06 03:20:19

标签: arrays mongodb increment

我想使用数组作为与此文档关联的文档的计数器。每个数组元素对应一个文档,该数组中的数字对应于该文档的某些数据。这些数字不与其关联文档一起存储,因此可以对“主要”文档的字段以及“关联”文档的数组中的数据执行查询。

由于$ inc和数组初始化的变幻莫测,似乎无法做到这一点:

> use foo
switched to db foo
> db.foo.save({id: []})
> db.foo.update({}, {$inc: {'id.4': 1}})
> db.foo.find().pretty()
{
    "_id" : ObjectId("5279b3339a056b26e64eef0d"),
    "id" : [
        null,
        null,
        null,
        null,
        1
    ]
}
> db.foo.update({}, {$inc: {'id.2': 1}})
Cannot apply $inc modifier to non-number

有没有办法增加null或用零初始化数组?

另一种方法是将数组值存储为键/值格式,因此这将是一个稀疏数组,但是没有办法将数据插入到数组中,这使得该替代方法变得不可行。

1 个答案:

答案 0 :(得分:1)

虽然我不赞成可能无限制的大小数组,但你可以使用一些技巧来使正确的事情发生在这里:

db.foo.insert({id:[]})

无论何时在索引N处递增计数器,请确保将所有索引递增0到N.

db.foo.update({}, {$inc: {'id.0':0, 'id.1':0, 'id.2':0, 'id.3':0, 'id.4':1 } })
db.foo.update({}, {$inc: {'id.0':0, 'id.1':0, 'id.2':1 } })
db.foo.find()
{ "_id" : ObjectId("5279c8de0e05b308d0cf21ca"), "id" : [  0,  0,  1,  0,  1 ] }