我在MongoDB中有一个具有以下结构的集合:
[
{
"Name" : "A",
"CustomerInfo" : [
{
"CustomerCompany" : "abc",
"CustomerEmail" : "user1@abc.com",
"SubmissionDate" : 1415070090
},
{
"CustomerCompany" : "xyz",
"CustomerEmail" : "user2@xyz.com",
"SubmissionDate" : 1438820000
}
]
},
{
"Name" : "B",
},
{
"Name" : "C",
"CustomerInfo" : [
{
"CustomerCompany" : "mno",
"CustomerEmail" : "user3@mno.com",
"SubmissionDate" : 1412590000
}
]
}
...
]
在elasticsearch中为此集合创建了一条河流
curl -XPUT 'http://localhost:9200/_river/product_custinfo/_meta' -d '{
"index": {
"name": "CustomerInfo",
"type": "CustomerInfo"
},
"mongodb": {
"db": "MyDB",
"collection": "CustInfo"
},
"type": "mongodb"
}'
河流创建的地图:
"CustomerInfo" : {
"properties" : {
"CustomerCompany" : {
"type" : "string"
},
"CustomerEmail" : {
"type" : "string"
},
"SubmissionDate" : {
"type" : "long"
}
}
}
现在我想查询拥有2个以上客户的文档。 (注意:它可以是任何值)。 我能够使用以下查询在MongoDB中获得结果:
db.CustInfo.find({'$where' : 'this.CustomerInfo.length > 2'})
根据this问题,我尝试了这个弹性搜索查询:
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{"exists" : {
"field" : "CustomerInfo"
}
},
{"script" : {
"script" : "doc['CustomerInfo'].size() > 2"
}
}
]
}
}
}
}
}
导致此错误:
嵌套:GroovyScriptExecutionException [ElasticsearchIllegalArgumentException [在使用types []]的映射中找不到[CustomerInfo]的字段];
使用_source
代替doc
会得到正确的结果,但速度很慢。
"script" : {
"script" : "_source.CustomerInfo.size() > 2"
}
是否有其他方法可以根据数组字段大小过滤结果? 我不想创建一个拥有众多客户的新领域。
MongoDB:3.0.7
ElasticSearch:1.4.2
Elasticsearch-River-Plugin:2.0.9
答案 0 :(得分:2)
朗讯中不存在字段@/usr/bin/python /path/to/your/kivy/main.py
,现有的字段为CustomerInfo
,CustomerInfo.CustomerCompany
和CustomerInfo.CustomerEmail
。所以你可以使用CustomerInfo.SubmissionDate