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

Peta Kurangi jenis kueri dengan kebutuhan untuk berkorelasi dengan baris sebelumnya

Jika Anda melakukan ini dalam basis data relasional, Anda tidak akan membandingkan kunjungan baris demi baris, sebaliknya Anda akan menggunakan kueri agregasi untuk menemukan kunjungan berulang (menggunakan SELECT ... GROUP BY) jadi Anda harus melakukannya dengan cara yang sama di MongoDB.

Pertama, Anda perlu mengumpulkan kunjungan per pelanggan per toko per hari:

group1 = { "$group" : {
        "_id" : {
            "c" : "$clientId",
            "l" : "$location",
            "day" : {
                "y" : {
                    "$year" : "$tov"
                },
                "m" : {
                    "$month" : "$tov"
                },
                "d" : {
                    "$dayOfMonth" : "$tov"
                }
            }
        },
        "visits" : {
            "$sum" : 1
        }
    }
};

EDIT karena Anda hanya ingin mengulang DAYS berikutnya, Anda akan mengelompokkan menurut pelanggan, menurut toko, dan menghitung berapa banyak DAYS yang berbeda untuk kunjungan pelanggan tersebut ke toko itu:

group2 = {"$group" : 
    {"_id" : {
        "c" : "$_id.c",
        "s" : "$_id.l"
    },
    "totalDays" : {
        "$sum" : 1
    }
} };

Kemudian Anda hanya ingin menyertakan catatan dari atas di mana terdapat lebih dari satu kunjungan oleh pelanggan yang sama ke toko yang sama selama beberapa hari:

match = { "$match" : { "totalDays" : { "$gt" : 1 } } };

Berikut adalah contoh kumpulan data dan hasil dari agregasi ini menggunakan operasi pipeline di atas:

> db.visits.find({},{_id:0,purchases:0}).sort({location:1, clientId:1, tov:1})
{ "clientId" : 1, "location" : "l1", "tov" : ISODate("2013-01-01T20:00:00Z") }
{ "clientId" : 1, "location" : "l1", "tov" : ISODate("2013-01-01T21:00:00Z") }
{ "clientId" : 1, "location" : "l1", "tov" : ISODate("2013-01-03T20:00:00Z") }
{ "clientId" : 2, "location" : "l1", "tov" : ISODate("2013-01-01T21:00:00Z") }
{ "clientId" : 3, "location" : "l1", "tov" : ISODate("2013-01-01T21:00:00Z") }
{ "clientId" : 3, "location" : "l1", "tov" : ISODate("2013-01-02T21:00:00Z") }
{ "clientId" : 1, "location" : "l2", "tov" : ISODate("2013-01-01T23:00:00Z") }
{ "clientId" : 3, "location" : "l2", "tov" : ISODate("2013-01-02T21:00:00Z") }
{ "clientId" : 3, "location" : "l2", "tov" : ISODate("2013-01-02T21:00:00Z") }
{ "clientId" : 1, "location" : "l3", "tov" : ISODate("2013-01-03T20:00:00Z") }
{ "clientId" : 2, "location" : "l3", "tov" : ISODate("2013-01-04T20:00:00Z") }
{ "clientId" : 4, "location" : "l3", "tov" : ISODate("2013-01-04T20:00:00Z") }
{ "clientId" : 4, "location" : "l3", "tov" : ISODate("2013-01-04T21:00:00Z") }
{ "clientId" : 4, "location" : "l3", "tov" : ISODate("2013-01-04T22:00:00Z") }

> db.visits.aggregate(group1, group2, match)
{
    "result" : [
    {
        "_id" : {
            "c" : 3,
            "s" : "l1"
        },
        "totalDays" : 2
    },
    {
        "_id" : {
            "c" : 1,
            "s" : "l1"
        },
        "totalDays" : 2
    }
    ],
    "ok" : 1
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengapa ObjectIds MongooseJS saya gagal dalam tes kesetaraan?

  2. Dorong elemen ke array di luwak

  3. Predikat Linq Dinamis memunculkan kesalahan Filter yang Tidak Didukung dengan Driver C# MongoDB

  4. Cara termudah untuk menginstal ekstensi PHP Mongodb di Ubuntu 13.10 (cakep)?

  5. Apa perbedaan antara database jurnal dan non jurnal Mongodb?