loopback-mongodb-connector修改以支持slug id

时间:2014-02-18 22:50:59

标签: mongodb model slug strongloop loopbackjs

我想在 Loopback

中使用 slugs String)而不是ObjectID来表示我在REST中公开的一些对象

What the docs says about model ids:

  

默认情况下,如果未定义ID属性且模型选项的idInjection为false,则LDL会自动将id属性添加到模型中,如下所示:

id: {type: Number, generated: true, id: true}

我认为我只需指定String作为类型,并generated: false以避免该环回生成ObjectId

id: { type: String, generated: false, id: true },

- >这根本不起作用

In the codemongodb.js我看到无论id的名称是什么,它都包含ObjectID函数,这解释了String的丢失}值。

旁注:另外, generated 属性从未在mongodb连接器代码中使用,它的用途是什么?

到目前为止我的解决方案

添加一个自定义属性( objectId ,因为我不确定生成的是什么用于)我的架构定义,它变为:

id: {
    type: String, 
    objectId: false, 
    id: true
},

然后我在MongoDB.prototype.create@mongodb.js:155中使用此属性:

var isObjectId = self.getDataSource(model)
                     .getModelDefinition(model)
                     .properties[idName]
                     .objectId;

if (idValue === null) {
    delete data[idName]; // Allow MongoDB to generate the id
} else {
    var oid = isObjectId ? ObjectID(idValue) : idValue; // Is it an Object ID?
    data._id = oid; // Set it to _id
    delete data[idName];
}

我以同样的方式更新了save()方法,现在我可以使用slug插入/修改对象,并从REST接口访问它们。

问题

我不确定这是对的,它会破坏什么吗?

另外,我真的不喜欢修改依赖关系的想法,所以我更喜欢使用官方方法,或者如果你们在 StrongLoop 认为你可以使用此

1 个答案:

答案 0 :(得分:3)

您应该能够使用以下定义:

  1. 在客户端设置字符串ID

    id: { type: String, generated: false, id: true }
    
    1. 将ObjectID用作字符串

      id: { type: String, generated: true, id: true }
      
    2. LoopBack mongodb连接器尝试遵守id类型。如果字符串格式与ObjectID匹配,它只会转换为ObjectID。

      最近修复了一个错误,但尚未发布:

      https://github.com/strongloop/loopback-connector-mongodb/pull/15

      如果不适合您,请在https://groups.google.com/forum/#!forum/loopbackjs告诉我们。