MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Proyeksi daftar MongoDB dari subbidang

Saya menemukan perintah!! itu bukan find() :-)

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

db.collection.distinct

(sunting)

Ops, jawaban "benar sekali" adalah daftar (di mana pengulangan dimungkinkan) bukan set (dimana tidak terjadi pengulangan). Lihat kasus db.lang_meta.distinct("resources.mediatype") , di mana solusi yang benar harus mengembalikan daftar empat item berulang, bukan hanya satu.

Untuk daftar kita bisa menggunakan map() ... Nah, misalkan hanya satu item, itu adalah ...

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

tetapi harus mengulangi .resources dan di atas .fields , jadi

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;
});

... yang mendekati tetapi bukan solusi ideal (elegan).

Kembali ke resources.mediatype contoh, itu adalah ilustrasi yang lebih baik untuk "repeat itens",

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;
});

Itu menghasilkan "text/csv", "text/csv", "text/csv", "text/csv" (!)tetapi dalam struktur array-of-array... bukan array sederhana.

Solusi?

Mari lakukan sesuatu dengan db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kueri tanggal berfungsi dengan _id tetapi tidak dengan nilai Tanggal - MongoDB

  2. Agregasi Mongo, memproyeksikan subbidang dari elemen pertama dalam array

  3. Pencegahan Injeksi NoSQL JavaScript di MongoDB

  4. Bisakah saya mengubah indeks yang ada di MongoDB tanpa menghapusnya?

  5. pasport.js - mengautentikasi pengguna dari MongoDB dengan paspor-lokal