将字符串转换为ObjectId会随机失败

时间:2017-08-30 16:25:10

标签: mongodb loopbackjs

我在loopback.js中将字符串转换为ObjectId时遇到了一些麻烦。 有时它作为字符串插入,因此关系和过滤器不起作用(GUID字段)。数据库中的示例:

/* 1 */
{
    "_id" : ObjectId("59a3d023fe1dfe3cd6fae101"),
    "GUID" : "59a3d023f82383384ea87e40",
    "username" : "John Doe"
}
/* 2 */
{
    "_id" : ObjectId("59a3d0f3fe1dfe3cd6fae104"),
    "GUID" : ObjectId("59a3d023f82383384ea87e40"),
    "username" : "John Doe"
}

GUID字段是来自其他loopback / Mongo应用程序的现有ID。你可以看到它在2个文档中是相同的GUID,我运行了两次相同的代码,第二次运行.. 我使用的代码:

data.user.GUID = new ObjectID(data.user.GUID);
data.project.GUID = new ObjectID(data.project.GUID);

return Promise.all([
    app.models.user.upsertWithWhere({
        GUID: data.user.GUID
    }, {
        GUID: data.user.GUID,
        username: data.user.username
    }),
    app.models.project.upsertWithWhere({
        GUID: data.project.GUID
    }, {
        GUID: data.project.GUID,
        name: data.project.name
    })
]).then((result) => {
    // console.log("USER", result[0]);
    // console.log("PROJECT", result[1]);
    return result;
});

如果你能帮助我,我真的不明白发生了什么! < 3

1 个答案:

答案 0 :(得分:0)

免责声明:我是LoopBack维护者之一。

我担心LoopBack在所有情况下仍然无法正确处理ObjectID。如果它能解决您遇到的问题,可以尝试以下几点:

1)在模型配置中启用strictObjectIDCoercion标志(docs)。

// common/models/project.json
{
  "name": "Project",
  // ...
  "options": {
    "validateUpsert": true,
    "strictObjectIDCoercion": true
  }
}

2)将loopback-datatype-objectid添加到您的应用中,并将您的GUID属性定义为"type": "objectid"。有关详细信息,请参阅this comment