【问题标题】:MongoDB list projection of subfield子字段的MongoDB列表投影
【发布时间】:2015-12-19 10:04:21
【问题描述】:

用 SQL 类比,我需要 SELECT root.subfield1.subfield2 FROM collection,它会产生 子字段 2 的列表 ... 使用示例:通过

导入此datapackage.json

mongoimport -d lang_db -c lang_meta datapackage.json --jsonArray

并使用mongo 命令在终端工作:

db.lang_meta.find({},{"resources.schema.fields.name":2})

结果是一个数组元素 (.count()=1),其子字段包含名称,而不是名称列表。


转储

获得:

{
    "_id": ObjectId("56011be94564569fc920eda4"),
    "resources": [{
    "schema": {
        "fields": [{
            "name": "alpha2"
        }, {
            "name": "English"
        }]
    }
    }, {
    "schema": {
        "fields": [{
            "name": "alpha3-b"
        }, {
            "name": "alpha2"
        }, {
            "name": "English"
        }]
    }
    }, {
    "schema": {
        "fields": [{
            "name": "alpha3-b"
        }, {
            "name": "alpha3-t"
        }, {
            "name": "alpha2"
        }, {
            "name": "English"
        }, {
            "name": "French"
        }]
    }
    }, {
    "schema": {
        "fields": [{
            "name": "lang"
        }, {
            "name": "langType"
        }, {
            "name": "territory"
        }, {
            "name": "revGenDate"
        }, {
            "name": "defs"
        }, {
            "name": "dftLang"
        }, {
            "name": "file"
        }]
    }
    }]
}

想要:

"alpha2","English","alpha3-b", "alpha2", "English" ...

【问题讨论】:

  • 像这样使用distinct distinct("resources.schema.fields.name")
  • @Yogesh 谢谢!!而且,操作,对不起,我可以在下面删除...我在指南中寻找,但在回答时看不到您的答案... 2 分钟 ...

标签: mongodb projection


【解决方案1】:

我找到命令了!!不是find() :-)

db.lang_meta.distinct("resources.schema.fields.name")

db.collection.distinct


(编辑)

Ops,“严格正确”的答案是一个 list(可以重复的地方)而不是 set(没有重复出现的地方)。请参阅db.lang_meta.distinct("resources.mediatype") 的案例,其中正确的解决方案必须返回一个包含四个重复项的列表,而不仅仅是一个。

对于list,我们可以使用map()...好吧,假设只有一项,那就是...

db.lang_meta.find().map(function(c) { 
  return c.resources[0].schema.fields[0].name; 
});

但必须遍历.resources.fields,所以

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
        for (var j=0; j<c.resources[i].schema.fields.length; j++) 
             ret.push( c.resources[i].schema.fields[j].name );
   return ret;
});

...接近但不是理想(优雅)的解决方案。

回到resources.mediatype的例子,这是对“重复”的更好说明,

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
             ret.push( c.resources[i].mediatype );
   return ret;
});

产生"text/csv", "text/csv", "text/csv", "text/csv" (!) 但在数组结构中......不是一个简单的数组。

解决方案?

让我们用db.lang_meta.find({},{"resources.schema.fields.name":1}) 做点什么...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多