2014-12-29 30 views
1

我的问题与this密切相关,但不相似。项目阶段操作员在投影阵列中的行为

我有我收集的样本文件:

db.t.insert({"a":1,"b":2}); 

我的意图是项目名为arraycombinedab共同的价值观领域。 ([1,2])

我只是尝试用$project阶段汇总:

db.t.aggregate([ 
{$project:{"combined":[]}} 
]) 

MongoDB抛出一个错误:disallowed field type Array in object expression

这意味着一个字段不能投影为数组。

但是,当我使用$cond运营商投影数组,该字段被投影。

db.t.aggregate([ 
{$project:{"combined":{$cond:[{$eq:[1,1]},["$a","$b"],"$a"]}}} 
]) 

我得到了o/p:{"combined" : [ "$a", "$b" ] }

如果您注意到输出,将ab的值视为它们是文字而不是字段路径。

任何人都可以请向我解释这种现象?当我做失败的情况下,

db.t.aggregate([ 
{$project:{"combined":{$cond:[{$eq:[1,2]},["$a","$b"],"$a"]}}} 
]) 

我得到预期的输出,其中$a被视为田间小路,因为$a不括作为数组元素。

回答

4

我以前也遇到过这个问题,它很烦人,但实际上它的工作原理与文字为["$a", "$b"];关于不允许的字段类型的第一个错误是...不清楚它为什么会抱怨。但是,您必须遵循文档中展开的$project阶段的语法描述。我会尽力在这里做。始于$project

The $project stage has the following prototype form:

{ $project: { <specifications> } } 

和规格可以是下列之一:

1. <field> : <1 or true or 0 or false> 
2. <field> : <expression> 

什么是体现在哪里?来自aggregation expressions

Expressions can include field paths and system variables, literals, expression objects, and operator expressions.

这些都是什么东西?字段路径/系统变量应该很熟悉:它是一个以$或$$为前缀的字符串文字。表达式对象具有形式

{ <field1>: <expression1>, ... } 

而操作表达式的形式之一

{ <operator>: [ <argument1>, <argument2> ... ] } 

{ <operator>: <argument> } 

为值的<operator>一些枚举列表。

什么是<argument>?文档并不清楚,但根据我的经验,我认为它是任何表达式,受到给定运算符的语法规则的影响(检查问题中的运算符表达式"cond" : ...)。

阵列适合仅作为参数列表和文字容器。文字是文字 - 他们的内容不被用于评估场路径或系统变量,这就是为什么在$cond阵列字面参数与值[ "$a", "$b" ]结束。评估参数数组中的表达式。

约阵列是不允许的值类型的第一个错误是有点奇怪我,由于文字的阵列是有效的表达式,所以根据文档它可以在一个对象表达式的值。在将它解析为对象表达式的一部分时,我也没有看到任何歧义。看起来这只是他们为了使分析更简单而制定的规则?你可以在“轻功”,它使用$literal放在一个常量数组值:

db.collection.project([{ "$project" : { "combined" : { "$literal" : [1, 2] } } }]) 

我希望这有助于解释为什么事情以这种方式工作。当我第一次尝试做类似[ "$a", "$b" ]的事情时,我感到很惊讶,它没有按照我的预期工作。至少,如果有一个功能可以将字段路径打包到数组中,那将会很不错。我也发现它的用途是$group也是有序的值对。

有一个JIRA机票SERVER-8141,请求$array运营商来帮助解决这类情况。

+0

感谢您的解释和链接。我想,一个部件上的文档可以提高,是在引入部分为每个操作员,或者至少一个流水线阶段,其中规定,管道的语法是如何让解析并解释在服务器上,这样我们就可以推断那些在文档中没有明确提及的小东西。 – BatScream

+0

感谢您的详细解释!帮助我的聚合查询 - http://stackoverflow.com/questions/40259171/mongo-aggregation-query-in-golang-with-mgo-driver –