英文:
execute mongodb functions from mgo golang
问题
在使用结构体对象进行更新或插入操作时,是否可以使用mgo驱动程序执行mongodb函数?
err := db.C(collectionName).UpdateId(eventID, Event{
Name: eventName,
Club: getClubName(clubID), //如何调用mongodb的getClubName函数?
})
我有一个mongodb函数,当给定一个俱乐部ID时,返回俱乐部名称。在mongodb shell中,以下命令可以正常执行:
db.loadServerScripts();
db.Event.update({"_id" : "30fc..."}, {"name": "foo_bar" , "clubName": getClubName("4df32...")});
我可以执行额外的数据库查询来获取俱乐部名称,但如果可能的话,我更希望这个操作是原子的。
英文:
Is it possible to use mgo driver to execute mongodb functions during an update or insert while using a struct object?
err := db.C(collectionName).UpdateId(eventID, Event{
Name: eventName,
Club: getClubName(clubID), //how to call mongodb getClubName function?
})
I have a mongodb function that returns a club name when given a club id. The following executes OK in the mongodb shell.
db.loadServerScripts();
db.Event.update({"_id" : "30fc..."}, {"name": "foo_bar" , "clubName": getClubName("4df32...")});
I can execute an additional database lookup to get the club name, but would prefer this to be atomic if possible.
答案1
得分: 1
根据类似的问题,在插入操作期间无法评估JavaScript。我认为可以安全地假设更新、upsert等操作也是如此。
您可以通过使用mgo的db.Run()方法来实现这一点,需要进行两次调用:
db.Run(bson.M{"eval": fmt.Sprintf("getClubName(%s);", clubID)}, &resp)
然后在更新语句中使用结果。
不幸的是,使用这种技术无法实现原子性。如果原子性是必需的,我建议将所有业务逻辑保留在应用程序中,并使用本地或基于数据库的锁定机制。
英文:
Per this similar question, there is no way to evaluate JavaScript during an insert. I think it's a safe assumption that the same goes for updates, upserts, etc.
You can achieve this in two calls by using mgo's db.Run() method:
db.Run(bson.M{"eval": fmt.Sprintf("getClubName(%s);", clubID)}, &resp)
And then using the result in your update statement.
Unfortunately, there is no way to make things atomic using this technique. If atomicity is a requirement, I would recommend keeping all the business logic in your application and using a local or database-based locking mechanism.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论