Mongodb 在Monk中玩流星魔球
我正在使用Express和Monk构建一个API,该API连接到一个数据库,在该数据库中编写的代码主要由Meteor应用程序处理 我知道Meteor使用自己的算法生成ID。所以当我这样做的时候:Mongodb 在Monk中玩流星魔球,mongodb,api,meteor,monk,Mongodb,Api,Meteor,Monk,我正在使用Express和Monk构建一个API,该API连接到一个数据库,在该数据库中编写的代码主要由Meteor应用程序处理 我知道Meteor使用自己的算法生成ID。所以当我这样做的时候: id = "aczXLTjzjjn3PchX6" // this is an ID generated by Meteor (not a valid MongoID) Users.findOne({ _id: id }, function(err, doc) { console.log(doc
id = "aczXLTjzjjn3PchX6" // this is an ID generated by Meteor (not a valid MongoID)
Users.findOne({ _id: id }, function(err, doc) {
console.log(doc);
});
输出:
Argument passed in must be a single String of 12 bytes or a string of 24 hex characters.
这样,设计一个可靠的RESTAPI对我来说似乎非常棘手。因此,我有两个问题:
var idConverter = Users.id; // Keep a reference in case...
Users.id = function (str) { return str; };
但别指望monk会自动转换ID
如何处理Meteor生成的ID和有效的MongoID()之间的查询差异?有没有一种简单的方法可以从Meteor数据库获取JSON结果
你不需要做什么。当它是有效的ObjectId(mongo db id)并且您得到一个字符串时,只需将其转换为Object id:
id = ObjectId(id);
User.find(id, ...)
以下是monk id方法的实现(this.col.id是对mongodb原生ObjectId的引用):
从API中插入文档(这次将具有有效的MongoId())会有问题吗?我将在数据库中同时使用这两种类型的ID,这对我来说非常糟糕/
这很糟糕。不过,如果你小心的话(以我在nodejs的经验来看),它不会造成太多麻烦。但并不是所有时候你都很小心(程序员错误经常发生),但这是可以管理的。在静态语言(如Java)中,这是一个很大的否定,因为字段只能有一种类型(string或ObjectId)
我的建议是,不要使用mongodb ObjectId,只使用字符串作为ID。在插入时,只需给它字符串_id,这样驱动程序就不会给它ObjectId。虽然您可以通过重写pkFactory来阻止驱动程序这样做,但使用monk似乎并不容易
还有一件事是monk并没有积极维护,它只是mongodb上面的一层薄薄的东西。根据我的经验,如果您有多个集合和大型/复杂的代码库,mongoose会更好地使用。只是为了更新这个问题 如中所述,Monk会自动将字符串投射到OjbectID中。 为了在不使用黑客解决方案的情况下禁用此行为,您必须禁用该功能。为了做到这一点,您只需要在获取数据库时将castIds设置为false。 因此: 现在这将起作用:
Users.findOne({ _id: "aczXLTjzjjn3PchX6" }, function(err, doc) {
console.log(doc);
});
哎哟Monk将字符串“自动广播”到提供的ObjectId类型。其他像猫鼬这样的动物在这方面更灵活一些。考虑在GITHUB上向作者发布一个问题,因为这不应该是一个假设。
const Users = db.get('users', { castIds: false });
Users.findOne({ _id: "aczXLTjzjjn3PchX6" }, function(err, doc) {
console.log(doc);
});