是否可以根据mongodb中的字段名投影字段?
Is it possible to project fields based on the field name in mongodb?
在集合中,文档可能包含 "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"的字段。我尝试了以下代码,但它似乎很愚蠢,并没有列出所有可能的 "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
}
可以使用$objectToArray
搜索字段名称,根据您需要搜索的数据,这可能不是最佳解决方案。
$objectToArray
将标签更改为键值对数组,然后 $unwind
搜索输入模式的键,$group + $arrayToObject
到 return 匹配键值对。
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"}}
])
在集合中,文档可能包含 "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"的字段。我尝试了以下代码,但它似乎很愚蠢,并没有列出所有可能的 "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
}
可以使用$objectToArray
搜索字段名称,根据您需要搜索的数据,这可能不是最佳解决方案。
$objectToArray
将标签更改为键值对数组,然后 $unwind
搜索输入模式的键,$group + $arrayToObject
到 return 匹配键值对。
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"}}
])