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

Hasil unik Rails &Mongoid

Anda tidak bisa begitu saja mengembalikan dokumen (atau subset) dengan menggunakan yang berbeda. Sesuai dengan dokumentasi itu hanya mengembalikan array nilai yang berbeda berdasarkan kunci yang diberikan. Tetapi Anda dapat mencapai ini dengan menggunakan pengurangan peta

var _map = function () {
    emit(this.hash.call_id, {doc:this});
}

var _reduce = function (key, values) {
    var ret = {doc:[]};
    var doc = {};
    values.forEach(function (value) {
    if (!doc[value.doc.hash.call_id]) {
           ret.doc.push(value.doc);
           doc[value.doc.hash.call_id] = true; //make the doc seen, so it will be picked only once
       }
    });
    return ret;
}

Kode di atas sudah cukup jelas, pada fungsi peta saya mengelompokkannya dengan kunci hash.call_id dan mengembalikan seluruh dokumen sehingga dapat diproses dengan fungsi reduksi.

Pada fungsi pengurangan, cukup lakukan loop melalui kumpulan hasil yang dikelompokkan dan pilih hanya satu item dari kumpulan yang dikelompokkan (di antara beberapa nilai kunci duplikat - simulasi berbeda).

Terakhir buat beberapa data pengujian

> db.disTest.insert({hash:{call_id:"1234"},something:"AAA"})
> db.disTest.insert({hash:{call_id:"1234"},something:"BBB"})
> db.disTest.insert({hash:{call_id:"1234"},something:"CCC"})
> db.disTest.insert({hash:{call_id:"5555"},something:"DDD"})
> db.disTest.insert({hash:{call_id:"5555"},something:"EEE"})
> db.disTest.find()
{ "_id" : ObjectId("4f30a27c4d203c27d8f4c584"), "hash" : { "call_id" : "1234" }, "something" : "AAA" }
{ "_id" : ObjectId("4f30a2844d203c27d8f4c585"), "hash" : { "call_id" : "1234" }, "something" : "BBB" }
{ "_id" : ObjectId("4f30a2894d203c27d8f4c586"), "hash" : { "call_id" : "1234" }, "something" : "CCC" }
{ "_id" : ObjectId("4f30a2944d203c27d8f4c587"), "hash" : { "call_id" : "5555" }, "something" : "DDD" }
{ "_id" : ObjectId("4f30a2994d203c27d8f4c588"), "hash" : { "call_id" : "5555" }, "something" : "EEE" }

dan menjalankan peta ini mengurangi

> db.disTest.mapReduce(_map,_reduce, {out: { inline : 1}})
{
    "results" : [
        {
            "_id" : "1234",
            "value" : {
                "doc" : [
                    {
                        "_id" : ObjectId("4f30a27c4d203c27d8f4c584"),
                        "hash" : {
                            "call_id" : "1234"
                        },
                        "something" : "AAA"
                    }
                ]
            }
        },
        {
            "_id" : "5555",
            "value" : {
                "doc" : [
                    {
                        "_id" : ObjectId("4f30a2944d203c27d8f4c587"),
                        "hash" : {
                            "call_id" : "5555"
                        },
                        "something" : "DDD"
                    }
                ]
            }
        }
    ],
    "timeMillis" : 2,
    "counts" : {
        "input" : 5,
        "emit" : 5,
        "reduce" : 2,
        "output" : 2
    },
    "ok" : 1,
}

Anda mendapatkan dokumen pertama dari set yang berbeda. Anda dapat melakukan hal yang sama di mongoid dengan terlebih dahulu merangkai fungsi map/reduce dan memanggil mapreduce seperti ini

  MyObject.collection.mapreduce(_map,_reduce,{:out => {:inline => 1},:raw=>true })

Semoga membantu




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $atau kueri

  2. MongoDB - Kueri Koleksi

  3. Bagaimana cara mendeskripsikan koleksi di Mongo?

  4. kesalahan TS2688:Tidak dapat menemukan file definisi tipe untuk 'bson'

  5. Panduan untuk Query di Spring Data MongoDB