MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB списък проекция на подполе

Намирам командата!! не е find() :-)

db.lang_meta.distinct("resources.schema.fields.name")

db.collection.distinct

(редактиране)

Опс, „строго правилният“ отговор е списък (където е възможно повторение на itens) не е набор (където не се случва повторение). Вижте случая на db.lang_meta.distinct("resources.mediatype") , където правилното решение трябва да върне списък от четири повтарящи се елемента, а не само един.

За списък можем да използваме map() ... Е, да предположим, че има само един елемент, той ще бъде ...

db.lang_meta.find().map(function(c) { 
  return c.resources[0].schema.fields[0].name; 
});

но трябва да повтори .resources и над .fields , така че

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
        for (var j=0; j<c.resources[i].schema.fields.length; j++) 
             ret.push( c.resources[i].schema.fields[j].name );
   return ret;
});

... това е близо, но не е идеалното (елегантно) решение.

Връщане към resources.mediatype например, това е по-добра илюстрация на "повтарящите се елементи",

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
             ret.push( c.resources[i].mediatype );
   return ret;
});

Това създава "text/csv", "text/csv", "text/csv", "text/csv" (!), но в структура масив от масив... не обикновен масив.

Решение?

Нека направим нещо с db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Извикайте съхранена функция на Mongodb от PHP7

  2. Как да групирате по различни полета

  3. Как да правите заявки с множество условия и тези условия са зависими

  4. MongoDB:Преброяване колко елементи с дадена стойност съществуват в масив, който е в документ?

  5. MongoDB:locale::facet::_S_create_c_locale името не е валидно