Mongodb 是否有一种方法可以投影字段的类型

Mongodb 是否有一种方法可以投影字段的类型,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,假设我们有如下文档,但我们只想返回包含数字信息的字段: { "_id" : ObjectId("52fac254f40ff600c10e56d4"), "name" : "Mikey", "list" : [ 1, 2, 3, 4, 5 ], "people" : [ "Fred", "Barney", "Wilma", "Betty" ], "status" : false, "created" : ISODate("2014-02-12T00:

假设我们有如下文档,但我们只想返回包含数字信息的字段:

{
    "_id" : ObjectId("52fac254f40ff600c10e56d4"),
    "name" : "Mikey",
    "list" : [ 1, 2, 3, 4, 5 ],
    "people" : [ "Fred", "Barney", "Wilma", "Betty" ],
    "status" : false,
    "created" : ISODate("2014-02-12T00:37:40.534Z"),
    "views" : 5
}
现在我知道,我们可以使用运算符查询与特定类型匹配的字段。但我还没有找到一种方法将其作为字段值进行$project。因此,如果我们查看未缠绕形式的文档,您会看到:

{
    "_id" : ObjectId("52fac254f40ff600c10e56d4"),
    "name" : 2,
    "list" : 16,
    "people" : 2
    "status" : 8,
    "created" : 9,
    "views" : 16
}
最终的目标是只列出与特定类型匹配的字段,比如说比较以获得数字类型,并在大量文档损坏后过滤掉字段,以产生如下结果:

{
    "_id" : ObjectId("52fac254f40ff600c10e56d4"),
    "list" : [ 1, 2, 3, 4, 5 ],
    "views" : 5
}

有人有办法解决这个问题吗。

有几个问题使得这不实用:

由于查询是一个与投影能力不同的参数,因此单从一个查询不可能实现这一点,因为投影不受查询结果的影响 由于聚合框架无法迭代字段和检查类型,所以这也不是一个选项 话虽如此,使用Map Reduce有一种稍微古怪的方法,它确实可以得到类似的答案,尽管在Map Reduce样式的输出中并不可怕:

map = function() {
    function isNumber(n) {
      return !isNaN(parseFloat(n)) && isFinite(n);
    }

    var numerics = [];
    for(var fn in this) {
        if (isNumber(this[fn])) {
            numerics.push({f: fn, v: this[fn]});
        }
        if (Array.isArray(this[fn])) {
            // example ... more complex logic needed
            if(isNumber(this[fn][0])) {
                numerics.push({f: fn, v: this[fn]});
            }
        }
    }
    emit(this._id, { n: numerics });
};

reduce = function(key, values) {
  return values;  
};
它并不完整,但结果与您想要的相似:

"_id" : ObjectId("52fac254f40ff600c10e56d4"),
 "value" : {
         "n" : [
                 {
                         "f" : "list",
                         "v" : [
                                 1,
                                 2,
                                 3,
                                 4,
                                 5
                         ]
                 },
                 {
                         "f" : "views",
                         "v" : 5
                 }
         ]
 }
地图只是查看每个属性,并决定它是否看起来像一个数字。。。如果是这样,添加到将存储为对象的数组中,这样map reduce引擎就不会阻塞数组输出。我在示例代码中保持了它的简单性-您可以肯定地改进数字和数组检查的逻辑:


当然,它不像查找或聚合那样实时,但由于MongoDB的设计并没有考虑到这一点,如果您真的需要此功能,可能必须这样做。

是的。这也是我的想法。这来自另一个问题,基本上是想用这种方式过滤字段。也许在聚合中使用$type操作符会很好,这与日期操作符差不多,但我真的不确定这样做的广泛实用性。