3

我想在Loopback中使用slugs ( String) 而不是ObjectID我的一些 REST 公开对象

文档对模型 ID 的描述:

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

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

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

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

--> 这根本不起作用

在代码中,mongodb.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认为可以使用它,可以写一个拉取请求。

4

1 回答 1

3

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

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

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

或者

  1. 使用 ObjectID 作为字符串

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

LoopBack mongodb 连接器尝试遵守 id 类型。仅当字符串格式与 ObjectID 匹配时,它才会转换为 ObjectID。

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

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

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

于 2014-02-18T23:54:53.300 回答