Схема документа Mongodb только с ключевой информацией - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть база данных в 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');
  });
});

1 Ответ

0 голосов
/ 07 февраля 2020

Я не уверен, зачем вам это нужно, просто на случай, если у вас есть какая-либо проверка схемы, вы можете получить оттуда ключи, если нет, скажем, поля в каждом документе в коллекции отличаются от других, тогда у каждого документа есть свой схема т.е. это собственный набор пар / полей ключ-значение. В таком случае вам нужны ключи для всех документов в коллекции или у вас нет этого сценария (все документы выглядят одинаково)? В любом случае, с помощью кода можно легко сделать несколько вещей, но с помощью этого запроса вы можете сделать это в 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" } }
])

Тест: MongoDB -Playground

Примечание: Если вы хотите записать агрегированный вывод в новую коллекцию, используйте $ merge или $ out .

...