是否可以根据mongodb中的字段名称来设置字段?

时间:2018-01-19 08:52:41

标签: database mongodb nosql data-analysis

在集合中,文档可能包含" name"," name:en"," name:de"

等字段
{
    _id:123456
    tag:{
        name: HongKong
        name-zh: 香港
        other_tag1: value1
        other_tag2: value2
    }
}
{
    _id:123457
    tag:{
        name-en: Beijing
        other_tag1: value1
        other_tag2: value2
    }
}

我想要的是列出所有字段名称包含" name"的字段。我尝试使用以下代码,但它似乎是愚蠢的,并没有列出所有可能的"名称" s。

find = {'$or': [{'tag.name': {'$exists': 1}}, {'tag.name:zh': {'$exists': 1}}, {'tag.name:en': {'$exists': 1}}]}
project = {'_id': 0, 'name': '$tag.name', 'name:zh': '$tag.name:zh', 'name:en': '$tag.name:en'}
names = list(db.node.aggregate([{'$match': find}, {'$project': project}]))

我想要的结果是:

{
    name: HongKong
    name-zh: 香港
}
{
    name-en: Beijing
}

1 个答案:

答案 0 :(得分:0)

可以使用$objectToArray搜索字段名称它可能不是基于您需要搜索的数据的最佳解决方案。

$objectToArray将标记更改为键值对的数组,然后$unwind搜索键以查找输入模式,并$group + $arrayToObject返回匹配的键值对。

db.col.aggregate([
    {$match:{'$or': [{'tag.name': {'$exists': 1}}, {'tag.name-zh': {'$exists': 1}}, {'tag.name-en': {'$exists': 1}}]}}, 
    {$project:{"tagskv":{$objectToArray:"$tag"}}},
    {$unwind:"$tagskv"},
    {$match:{"tagskv.k": { $regex: /name/i }}},
    {$group:{_id:"$_id", names:{$push:"$tagskv"}}},
    {$project:{"names":{$arrayToObject:"$names"}}},
    {$replaceRoot:{newRoot:"$names"}}
])