我想使用数组作为与此文档关联的文档的计数器。每个数组元素对应一个文档,该数组中的数字对应于该文档的某些数据。这些数字不与其关联文档一起存储,因此可以对“主要”文档的字段以及“关联”文档的数组中的数据执行查询。
由于$ 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或用零初始化数组?
另一种方法是将数组值存储为键/值格式,因此这将是一个稀疏数组,但是没有办法将数据插入到数组中,这使得该替代方法变得不可行。
答案 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 ] }