动态mongo投影 - 使用文档中的字段来确定投影的投影

时间:2014-07-25 07:25:20

标签: mongodb projection

说我有这样一个对象:

{default: 'x',
 types: {
  x:1,
  y:2,
  z:3
 }
}

是否有可能只选择types.x(即{"types.x":1}的投影)而不事先知道x是默认值?提出两个问题显然是可能的,而不是我正在寻找的。

1 个答案:

答案 0 :(得分:1)

不幸的是,作为聚合框架的一部分,这还不可用。但是,根据this JIRA ticket,它目前“按计划进行计划”。目前执行此操作的唯一方法是使用map / reduce功能。如果你想继续使用它,那就意味着要做如下的事情:

  1. 按_id映射每个文档并发出相应的密钥。
  2. 由于每个键只有一个值,因此不会调用reduce函数,但仍需要初始化用于reduce函数的变量。您可以使用空函数或空字符串。
  3. 运行map / reduce,将结果保存在您选择的集合中。
  4. 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执行此操作而不向应用程序添加更多逻辑的唯一方法。