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

Undo Unwind secara agregat di mongodb

Tentu saja Anda bisa menggunakan $push dan $first dalam $group untuk mengembalikan dokumen seperti semula:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$unwind":"$matchData"},
    { "$match":{
        "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$group": {
        "_id": "$_id",
        "venueId": { "$first": "$venueId" },
        "companyId": { "$first": "$companyId" },
        "cardTypeId": { "$first": "$cardTypeId" },
        "matchData": { "$push": "$matchData" }
    }}
])

Tetapi Anda mungkin harus menggunakan $filter dengan MongoDB 3.2 di tempat pertama:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$project": {
        "venueId": 1,
        "companyId": 1,
        "cardTypeId": 1,
        "matchData": { 
            "$filter": {
                "input": "$matchData",
                "as": "match",
                "cond": {
                   "$or": [
                       { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                   ]
                }
            }
        }
    }}
])

Dan jika Anda memiliki setidaknya MongoDB 2.6, Anda masih dapat menggunakan $map dan $setDifference sebagai gantinya:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$project": {
        "venueId": 1,
        "companyId": 1,
        "cardTypeId": 1,
        "matchData": { 
            "$setDifference": [
                { "$map": {
                    "input": "$matchData",
                    "as": "match",
                    "in": {
                        "$cond": [
                           { "$or": [
                              { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                           ]},
                            "$$match",
                            false
                        ]
                    }
                }},
                [false]
            ]
        }
    }}
])

Itu baik-baik saja ketika setiap elemen array sudah memiliki pengidentifikasi "unik", jadi operasi "set" hanya menghapus false nilai dari $map .

Keduanya merupakan cara untuk "memfilter" konten dari array tanpa benar-benar menggunakan $unwind

N.B :Tidak yakin apakah Anda benar-benar memahami $in digunakan untuk mencocokkan "daftar ketentuan" daripada diminta untuk mencocokkan pada array. Jadi umumnya syaratnya bisa saja:

 "matchData.matchId": ObjectId("57175c25561d87001e666d12")

Di mana Anda sebenarnya hanya memiliki satu nilai untuk dicocokkan. Anda menggunakan $in dan $or ketika Anda memiliki "daftar" kondisi. Array sendiri tidak ada bedanya dengan operator yang dibutuhkan.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. kelompokkan menurut tanggal di mongodb

  2. Apakah boleh mengubah ObjectId mongo menjadi string dan menggunakannya untuk URL?

  3. MongoDB Atlas Error saat melakukan transaksi pada beberapa koleksi (kode 8000)

  4. Bagaimana saya bisa mengaktifkan libmongoc ssl di PHP 7 untuk koneksi Mongodb?

  5. iptables memblokir koneksi lokal ke mongodb