说我有一个这样的对象:
{default: 'x',
types: {
x:1,
y:2,
z:3
}
}
是否可以仅选择types.x(即的投影{"types.x":1}
)而无需事先知道x是默认值?进行两个查询显然是可能的,而不是我要的查询。
不幸的是,这尚未成为聚合框架的一部分。但是,根据此JIRA票证,它当前是“按未计划的计划”。当前唯一的方法是使用map / reduce功能。如果要继续使用它,则意味着要执行以下操作:
在mongo
外壳中,它看起来如下所示:
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而不向应用程序添加更多逻辑的唯一方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句