我有一个现有的 MongoDB 集合,它基本上看起来像:
users: [
{
"_id": ObjectId("56a6f714a2c56f1c3b0f17f1"),
"name": "Daniel",
"phones" : [
{
"_id": ObjectId(""56a78dd1879c40ea63822141"),
"areacode": 333,
"number": 111111111
},
{
"_id": ObjectId(""56a78dd1879c40ea63822141"),
"areacode": 111,
"number": 99999999
}
]
},
{
"_id": ObjectId("56a6f714a2c56f1c3b0f17f1"),
"name": "John",
"phones" : [
{
"_id": ObjectId(""56a78dd1879c40ea63822141"),
"areacode": 333,
"number": 111111111
},
{
"_id": ObjectId(""56a78dd1879c40ea63822141"),
"areacode": 111,
"number": 99999999
}
]
}
]
如您所见,我在子文档中使用对象 ID 将此数据与外部集合相关联,我们在其中存储有关数字的附加信息。所有这些 ID 都是由 Mongoose 在其他自动生成的应用程序中自动生成的。
现在,在 Waterline 中,没有对子文档的模式支持,因此当对集合执行 find() 时,子文档 ObjectId 将作为 JSON 返回,而不是 ID 字符串。
这导致类似
results: [
{
"id": "56a6f714a2c56f1c3b0f17f1",
"name": "Daniel",
"phones" : [
{
"_id": {
"_bsontype": "ObjectID",
"id": "V§zÐ\u0019}dÒÏ_"
}
"areacode": 333,
"number": 111111111
},
{
"_id": {
"_bsontype": "ObjectID",
"id": "V§zÐ\u0019}dÒÏ_"
}
"areacode": 111,
"number": 99999999
}
]
}
]
Mongoose 可以优雅地处理这个问题,您始终可以让这些 id 可用于在客户端执行相关查询,但是使用 Waterline,并且没有嵌套模式,这似乎是另一个死胡同。
有没有什么办法可以解决这个问题,而无需在返回之前遍历整个集合,不必迁移数据库、更改文档或不必对数据库进行规范化?此数据由多个应用程序访问,并且需要保持原样。