说我有这样一个对象:
{default: 'x',
types: {
x:1,
y:2,
z:3
}
}
是否有可能只选择types.x(即{"types.x":1}
的投影)而不事先知道x是默认值?提出两个问题显然是可能的,而不是我正在寻找的。 p>
答案 0 :(得分:1)
不幸的是,作为聚合框架的一部分,这还不可用。但是,根据this JIRA ticket,它目前“按计划进行计划”。目前执行此操作的唯一方法是使用map / reduce功能。如果你想继续使用它,那就意味着要做如下的事情:
在mongo
shell中,它看起来如下:
var mapper = function() {
var typeValue = this.types[this.default];
emit(this._id, typeValue);
};
var reducer = "";
db.types.mapReduce(mapper, reducer, { out : "results" } );
如果您随后查询结果集合,您将获得如下内容:
> db.results.find();
{ "_id" : ObjectId("53d21a270dcfb83c7dba8da9"), "value" : 1 }
如果您想知道默认值是什么,您可以修改mapper
函数,以便将键作为值返回。它看起来像这样:
var mapper = function() {
var typeValue = this.types[this.default],
typeKey = "types." + this.default;
emit(this._id, { key : typeKey, val : typeValue } );
};
运行时,会产生如下结果:
> db.results.find().pretty();
{
"_id" : ObjectId("53d21a270dcfb83c7dba8da9"),
"value" : {
"key" : "types.x",
"val" : 1
}
}
请注意,这可能是一个比您想要的更复杂的解决方案,但这是使用MongoDB执行此操作而不向应用程序添加更多逻辑的唯一方法。