MongoDB Query, чтобы узнать все элементы массива коллекции

У меня есть довольно большой документ MongoDB, который содержит все виды данных. Мне нужно идентифицировать поля типа массива в коллекции, чтобы я мог удалить их из отображаемых полей в сетке, которую я буду заполнять.

Мой метод теперь состоит из получения всех имен полей в коллекции с помощью

Это было взято из ответа, опубликованного здесь MongoDB Получить имена всех ключи в коллекции

mr = db.runCommand({
  "mapreduce" : "Product",
  "map" : function() {
    for (var key in this) { emit(key, null); }
  },
  "reduce" : function(key, stuff) { return null; }, 
  "out": "things" + "_keys"
})

db[mr.result].distinct("_id")

И запустить для каждого из полей запрос, подобный этому

db.Product.find( { $where : "Array.isArray(this.Orders)" } ).count()

Если есть что-то полученное, поле считается массивом.

Мне не нравится, что мне нужно запускать n+2 запросов (n — количество различных полей в моей коллекции), и я не хотел бы жестко кодировать поля в модели. Это разрушило бы всю цель использования MongoDB.

Есть ли лучший способ сделать это?


person Daniel Luca CleanUnicorn    schedule 21.03.2013    source источник


Ответы (1)


Я сделал несколько небольших изменений в коде, который вы указали выше:

mr = db.runCommand({
  "mapreduce" : "Product",
  "map" : function() {
    for (var key in this) { 
       if (Array.isArray(this[key])) {
          emit(key, 1); 
       } else {
          emit(key, 0);
       }
    }
  },
  "reduce" : function(key, stuff) { return Array.sum(stuff); }, 
  "out": "Product" + "_keys"
})

Теперь преобразователь будет выдавать 1 для ключей, содержащих массивы, и 0 для всех ключей, которые их не содержат. Редуктор суммирует их, так что когда вы проверите конечный результат:

db[mr.result].find()

Вы увидите имена полей с количеством документов, в которых они содержат значения массива (и 0 для тех, которые никогда не являются массивами).

Таким образом, это должно дать вам, какие поля содержат типы массивов только с заданием уменьшения карты.

--

Просто чтобы увидеть это с некоторыми данными:

db.Product.insert({"a":[1,2,3], "c":[1,2]})
db.Product.insert({"a":1, "b":2})
db.Product.insert({"a":1, "c":[2,3]})

(теперь запустите код "mr =" выше)

db[mr.result].find()
{ "_id" : "_id", "value" : 0 }
{ "_id" : "a", "value" : 1 }
{ "_id" : "b", "value" : 0 }
{ "_id" : "c", "value" : 2 }
person bcm360    schedule 22.03.2013