我正在使用Elasticsearch来存储来自Winston的REST API的所有日志。经过测试并通过我的API提出了一些请求之后,我注意到我多次获得'object mapping for [fields.meta.res.body.x] tried to parse field [x] as object, but found a concrete value'
。发生这种情况是因为我并不总是填充字段,这可能导致具有ID的字段或具有包含已填充数据的对象的字段。
例如响应可以是:
{
"_id": "5c6be1ab42cb9db50832469e",
"name": "xyz",
"role": "5c3e003efb6fc0600be0d642"
}
或
{
"_id": "5c6be1ab42cb9db50832469e",
"name": "xyz",
"role": {
"_id": "5c3e003efb6fc0600be0d642",
"name": "admin"
}
}
有什么方法可以使字段接受两种不同类型的值?如果没有,解决该问题的最佳方法是什么?谢谢!
答案 0 :(得分:1)
您不能有一个object
字段(即role
)包含一个具体值(即一个字符串),反之亦然。您需要决定一个。在您的情况下,似乎总是合理的做法是始终将role
指定为对象,如果没有值,则将role.name
保留为null。如果不是这样:
{
"_id": "5c6be1ab42cb9db50832469e",
"name": "xyz",
"role": "5c3e003efb6fc0600be0d642" <-- this is no good since role is an object
}
使用此:
{
"_id": "5c6be1ab42cb9db50832469e",
"name": "xyz",
"role": {
"_id": "5c3e003efb6fc0600be0d642", <-- specify the id here
"name": null <-- use null here
}
}
如果您遇到相反的问题(即尝试将对象适合到字符串中),则需要确保role
实际上包含role._id
的值,即代替此值
{
"_id": "5c6be1ab42cb9db50832469e",
"name": "xyz",
"role": {
"_id": "5c3e003efb6fc0600be0d642",
"name": null
}
}
使用此:
{
"_id": "5c6be1ab42cb9db50832469e",
"name": "xyz",
"role": "5c3e003efb6fc0600be0d642" <-- this should be role._id
}