Mongodb 在Monk中玩流星魔球

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

我正在使用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);
});
输出:

Argument passed in must be a single String of 12 bytes or a string of 24 hex characters.
这样,设计一个可靠的RESTAPI对我来说似乎非常棘手。因此,我有两个问题:

  • 如何处理Meteor生成的ID和有效的MongoID()之间的查询差异?有没有一种简单的方法可以从Meteor数据库获取JSON结果

  • 从API中插入文档(这次将具有有效的MongoId())会有问题吗?我将在数据库中同时使用这两种类型的ID,这对我来说非常糟糕/

  • 正如我在中所说,您可以覆盖monk的id转换器部分:

    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);
    });