我在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中做到这一点,甚至可以在字段的某些级别进行:
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