仅具有关键信息的Mongodb文档架构

问题描述 投票:-1回答:1

我在MongoDB中有一些集合和文档的数据库。我希望集合中的文档架构仅显示文档中的键而不显示值。

示例:如果我的藏书是

{
  "name":"ram",
  "department":"cse",
  "age":"30"
}

然后我希望db的输出为

{
  "name":"",
  "department":"",
  "age":""
} 

是否有一种以所需格式从mongodb检索文档的方法

我试图使用mapreduce函数来实现,但无法获得所需的结果:

db.MyCollectionName.mapReduce(function () {
  for (var key in this) {
    emit(key, null);
  }
}, function (key, stuff) {
  return null;
}, {"out": "allFieldNames"}, function (err, results) {
  var fields = db.collection('allFieldNames').distinct('_id');
  fields.then(function (data) {
    var finalData = {"status": "success", "fields": data};
    res.send(finalData);
    delteCollection(db, 'allFieldNames');
  }).catch(function (err) {
    res.send(err);
    delteCollection(db, 'allFieldNames');
  });
});
mongodb pymongo document
1个回答
0
投票

我不确定为什么要这样做,以防万一,如果您进行了任何模式验证,都可以从那里获取键,如果不是说集合中每个文档中的字段都与其他字段不同,那么每个文档都有自己的模式即它是一组自己的键/值对/字段集,那么您是否需要集合中所有文档的键,或者您没有这种情况(所有文档看起来都一样)?无论如何,使用代码可以轻松完成几件事,但是通过此查询,您可以在MongoDB中做到这一点,甚至可以在字段的某些级别进行:

db.collection.aggregate([{ $limit: 1 }, { $project: { data: { $objectToArray: "$$ROOT" } } },
{
    $project:
    {
        "data": {
            $arrayToObject: {
                $map: {
                    input: '$data', as: 'each', in:
                    {
                        $switch:
                        {
                            branches: [
                                {
                                    case: { $eq: [{ $type: '$$each.v' }, 'object'] },
                                    then: { k: '$$each.k', v: { $arrayToObject: { $map: { input: { $objectToArray: "$$each.v" }, as: 'each', in: { k: '$$each.k', v: { $type: '$$each.v' } } } } } }
                                },
                                {
                                    case: { $isArray: "$$each.v" },
                                    then: {
                                        k: '$$each.k', v:
                                        {
                                            $map: {
                                                input: "$$each.v", as: 'each', in:
                                                {
                                                    $cond: [{ $eq: [{ $type: '$$each' }, 'object'] },
                                                    { $arrayToObject: { $map: { input: { $objectToArray: "$$each" }, as: 'each', in: { k: '$$each.k', v: { $type: '$$each.v' } } } } },
                                                    { $type: '$$each' }]
                                                }
                                            }
                                        }
                                    }
                                }
                            ],
                            default: { k: '$$each.k', v: { $type: '$$each.v' } }
                        }
                    }
                }
            }
        }
    }
}, { $replaceRoot: { newRoot: "$data" } }
])

Test: MongoDB-Playground

注意:如果要将聚合输出写入新集合,请使用$merge$out

© www.soinside.com 2019 - 2024. All rights reserved.