我想用NodeJS和MongoDB支持实现hashtags功能,这样我也可以计算用途。每当用户向页面添加主题标签时,我想在数据库中推送或更新它们。每个hastag都是这样的:
{_id:<auto>, name:'hashtag_name', uses: 0}
我面临的问题是用户也可以添加新标签,因此当他点击“完成”时,我必须增加现有标签的“使用”字段,然后添加新标签。诀窍是如何只用一条Mongo指令做到这一点?到目前为止,我想到了实现这一目标的两种可能方法,但我对其中任何一种都不满意:
选项1
我有一个服务,在用户开始编写新文章之前从db中获取现有标签。基于此,我可以检测哪些标签是新的,并运行2个查询:一个将添加新标签,另一个将更新现有标签
选项2
我会将标签列表发送到服务器,然后我会为每个标签运行一个find();如果我找到一个,我会更新,如果没有,我会创建它。
选项3 (暂时没有解决方案)
最好的选择是运行一个带有一组标签名称的查询,对现有标签进行$ inc操作,然后添加缺少的那些。
问题
有更好的解决方案吗?我可以从选项#3获得最终结果吗?
答案 0 :(得分:2)
你应该做这样的事情,所有这些都将在一批中执行,这只是一个片段的想法如何做到:
var db = new Db('DBName', new Server('localhost', 27017));
// Establish connection to db
db.open(function(err, db) {
// Get the collection
var col = db.collection('myCollection');
var batch = col.initializeUnorderedBulkOp();
for (var tag in hashTagList){
// Add all tags to be executed (inserted or updated)
batch.find({_id:tag.id}).upsert().updateOne({$inc: {uses:1}});
}
batch.execute(function(err, result) {
db.close();
});
});
答案 1 :(得分:0)
我会使用自2.6版以来Mongodb提供的Bulk method。同样,当标签是新的时,你可以执行插入操作,当它已经存在时,计数器会更新。