如何使用loopback和mongodb将嵌套对象中的属性转换为ObjectId?

时间:2015-01-10 09:52:21

标签: javascript node.js mongodb casting loopbackjs

假设我有以下模型定义:

{
  "name": "Report",
  "idInjection": true,
  "trackChanges": true,
  "mongodb": {
    "collection": "report"
  },
  "properties": {
    "resource" : {"type": "String"},
    "date" : {"type": "Date"},
    "people" : [ {
        // Here's where I like to have an id property.
        "role" : {"type": "String"},
        "hours" : {"type": "Number"}
    } ],
    "name" : {"type": "String"}
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

现在我希望在people数组中的每个对象中都有id属性(使用类似report.people [0] .id进行访问)并且在插入和更新时应该已经到ObjectId。但是,loopback没有ObjectId类型,唯一的方法似乎是使用关系,但那么外键应该如何呢?

有没有办法在插入和更新时将id属性转换为ObjectId?

更新

我尝试使用embedsMany,但未转换ID:

这是我的report.json:

{
  "name": "Report",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "name": {
      "type": "string",
      "required": true
    }
  },
  "validations": [],
  "relations": {
    "people" : {
      "type": "embedsMany",
      "model": "ReportPerson",
      "options": {
        "validate": true,
        "autoId": false
      }
    }
  },
  "acls": [],
  "methods": []
}

这是我的报告-person.json:

{
  "name": "ReportPerson",
  "base": "Model",
  "idInjection": true,
  "properties": {
    "hours": {"type" : "number"}
  },
  "validations": [{
      "person" : {
          "model": "Person",
          "type": "belongsTo",
          "foreignKey": "id"
      }
  }],
  "relations": {},
  "acls": [],
  "methods": []
}

当我尝试使用http API插入此Report时:

{
    "name" : "report",
    "people" : [
        {
            "id" : "54c7926e1d621dc65495f069",
            "hours" : 2
        }
    ]
}

id不会被转换为ObjectId并在数据库中保持为字符串。

1 个答案:

答案 0 :(得分:1)

任何玩环回和mongodb的人都会偶尔点击这个。 为了解决环回中缺少ObjectId类型的问题: - 一种方法是确实描述使用属性作为外键的关系,如本文所述 - 另一方面,更清洁的imo是将属性定义为JSON文件中的id

请参阅model definition documentation

例如: { "myId": { "type": "string", "id": true, "generated": true } }

现在,对此属性的请求将通过执行actuel objectId或其字符串表示