【问题标题】:Dynamic mongo projection - a projection that uses a field in the document to determine the projection动态 mongo 投影 - 使用文档中的字段来确定投影的投影
【发布时间】:2014-07-25 07:25:20
【问题描述】:

假设我有一个这样的对象:

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

是否可以在事先不知道 x 是默认值的情况下只选择 types.x(即{"types.x":1} 的投影)?进行两个查询显然是可能的,而不是我想要的。

【问题讨论】:

  • 这些白痴投票结束这样的问题是谁?完全没必要。嘿白痴:当你投票结束某事时,写下为什么。如果你是正确,那么也许 OP 将来会避免这样的问题。如果你错了,我们都会看到你的推理有多愚蠢。我认为这是一个公平的交易。
  • 每个文档都有自己的默认值吗?并基于此您希望该领域投影?并且所有可能的默认值都事先知道吗?
  • 想一想,如果您的架构不同(如果您将类型存储为具有 {type:"x", value:1} 类型的数组,则可以使用聚合框架执行此操作元素。
  • 嗯,有趣的想法。我很惊讶聚合框架无法处理键。每个文档都有自己的默认值,是的。并且默认的可能值是不事先知道的。

标签: mongodb projection


【解决方案1】:

不幸的是,这还不能作为聚合框架的一部分。但是,根据this JIRA ticket 的说法,目前是“计划中的未计划”。目前这样做的唯一方法是使用 map/reduce 功能。如果您想继续使用它,则意味着执行以下操作:

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

【讨论】:

  • 感谢您的回答。与我必须运行的两个常规查询以产生相同的效果相比,你知道这个性能是什么吗?还是运行一个选择所有类型的查询的性能?
  • @BT,我不建议您使用 Map/Reduce 进行实时聚合。解释了here 的一些原因。如果您无法更改架构,我认为最好的选择是运行两个常规查询。此外,您绝对应该在我上面复制的 JIRA 票证中推动该功能的实施。由于来自社区的一些压力,它可能会在未来的 MongoDB 版本中实现。希望早点而不是晚点。
  • 感谢您提供的重要信息。我会将我的评论添加到列表中
猜你喜欢
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
相关资源
最近更新 更多