2016-03-04 74 views
0

我有以下格式JSON文档Couchbase视图“WHERE”子句动态

Name : 
Class : 
City : 
Type : 
Age : 
Level : 
Mother : 
Father : 

我有这样

function(doc,meta) 
{ 
    emit([doc.Name,doc.Age,doc.Type,doc.Level],null); 
} 

什么我可以做一个地图功能是给“名”和过滤掉所有的结果,但我也想做的只是给“年龄”,并过滤出来。对于该couchbase不提供功能来跳过“名称”键。所以我必须创建一个新的地图函数,它具有“年龄”作为第一个关键字,但是我也必须仅查询“Level”关键字,所以像这样。我将不得不为每个字段创建很多映射函数,这显然是不可行的,除了创建新的映射函数来实现这种类型的功能外,还有什么可以做的吗? 我不能用n1ql,因为我有1.5亿个文件,所以需要很多时间。

回答

2

首先 - 这不是一个很好的减少功能。

  1. 它不具有任何过滤
  2. 函数头应该是功能(DOC,间位)
  3. 如果有JSON和二进制对象之间的混合物 - 中添加meta.type == “JSON”

现在的事情可以做:

  1. 如果您正在使用V4及以上(V4.1中更推荐),您可以使用N1QL并使用它非常simila r转换为SQL语言。 (我不明白你为什么不能使用n1ql)
  2. 您可以在多个订单

即发出多个项目,如果我在

{ 
    "name": "Roi", 
    "age": 31 
} 

我能发出的格式有doc索引两个值:

function (doc, meta) { 
    if (meta.type=="json") { 
    emit(doc.name, null); 
    emit(doc.age, null); 
    } 
} 

现在我可以查询2个值。 这比创建2个视图好得多。

无论如何,如果你有什么要过滤 - 它总是建议。

+0

我的错误我在我的文章中写了不正确的标题功能。反正多个发射不会解决我的问题,因为假设我有两个发射像这样发出(doc.age,null)emit(doc.level,null);现在我将1值传递给键以过滤所有年龄为1的文档。但它也会给我具有1级的文档。因此,当两个字段具有相同的值时,多个发射无法帮助 –

+1

您可以在它之前附加字符串,如: 'function(doc,meta)if(meta.type ==“json”){ emit(“name_”+ doc.name,null); emit(“age_”+ doc.age,null); } }' –

+0

什么是我的json文档格式?像这样 '“name”:“name_legendary”' –