Mongodb替代Dot符号来编辑$ inc的嵌套字段

时间:2014-12-07 00:20:55

标签: mongodb

从概念上讲,我想弄清楚的是,除了点符号之外,还有其他方法可以使用mongo访问嵌套文档。

我想要完成的任务:

我有一个用户集合,每个用户都有一个嵌套的songVotes集合,其中这个嵌套的songVotes集合的键是songIds,值是他们的投票形式,用户-1,0或1。

我有一个"房间收藏"许多用户去了,每首歌的集体投票影响了房间。单个房间还有一个嵌套的songVotes集合,其密钥为songIds,但是该值是房间中所有用户累计投票的总数。出于Meteor.js的目的,当用户进入房间以将其投票添加到此嵌套累积投票集合时,其效率更高。 再次因为Meteor.js中的反应性连接不以任何有效的方式支持,所以打破这些嵌套的集合来解决我的问题也没有意义。

所以我遇到的麻烦就是这个更新操作,当用户第一次进入房间时,我采用单个用户嵌套的songVotes集合并使用mongo $ inc运算符将其应用于整个房间的嵌套累积songVotes集合。

问题是,如果要将$ inc运算符与嵌套字段一起使用,则必须使用点表示法来访问它们。所以我在广义上要求的是,如果有一种很好的方法将这样的更新应用于嵌套对象。或者为$ inc指定一个全局点符号前缀,例如:

var userVotes = db.collection.users.findOne('user_id').songVotes // userVotes --> { 'song1': 1, 'song2': -1 ... } db.rooms.update({ _id: 'blah' }, { $set: { roomSongVotes: { $inc: userVotes } } })

1 个答案:

答案 0 :(得分:1)

您确实需要使用点表示法,但您仍然可以通过以编程方式构建更新对象来执行此操作:

var userVotes = {'song1': 1, 'song2': -1};
var update = {$inc: {}};
for (var songId in userVotes) {
    update.$inc['roomSongVotes.' + songId] = userVotes[songId];
}
db.rooms.update({ _id: 'blah' }, update);

这样,update可以构建为:

{ '$inc': { 'roomSongVotes.song1': 1, 'roomSongVotes.song2': -1 } }