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

Cari dengan array Objek

Pada dasarnya Anda perlu $unwind arraynya dulu. MongoDB belum dapat bekerja dengan properti "dalam" dari suatu objek di dalam larik sebagai sumber untuk $lookup .

Juga untuk efisiensi, kita benar-benar harus menggunakan $concatArrays pertama untuk "bergabung" dengan sumber larik, lalu lakukan satu $lookup operasi:

Project.aggregate([
  { "$match": { "project_id": projectId} },
  { "$project": {
    "project_id": 1,
    "updated_at": 1,
    "created_at": 1,
    "owner": 1,
    "name": 1,
    "combined": {
      "$concatArrays": [
        { "$map": {
          "input": {
            "$filter": {
              "input": "$uploaded_files",
              "as": "uf",
              "cond": { "$eq": ["$$uf.upload_id", uploadId ] }
            }
          },
          "as": "uf",
          "in": {
            "$arrayToObject": {
              "$concatArrays": [
                { "$objectToArray": "$$uf" },
                [{ "k": "type", "v": "uploaded_files" }]
              ]
            }
          }
        }},
        { "$map": {
          "input": {
            "$filter": {
              "input": "$file_history",
              "as": "fh",
              "cond": { "$eq": ["$$fh.upload_id", uploadId ] }
            }
          },
          "as": "fh",
          "in": {
            "$arrayToObject": {
              "$concatArrays": [
                { "$objectToArray": "$$fh" },
                [{ "k": "type", "v": "file_history" }]
              ]
            }
          }
        }}
      ]
    }
  }},
  { "$unwind": "$combined" },
  { "$lookup": {
    "from": "files",
    "localField": "combined.file",
    "foreignField": "_id",
    "as": "combined.file"
  }},
  { "$unwind": "$combined.file" },
  { "$lookup": {
    "from": "users",
    "localField": "owner",
    "foreignField": "_id",
    "as": "owner"
  }},
  { "$unwind": "$owner" },
  { "$group": {
    "_id": "$_id",
    "project_id": { "$first": "$project_id" },
    "updated_at": { "$first": "$updated_at" },
    "created_at": { "$first": "$created_at" },
    "owner": { "$first": "$owner" },
    "name": { "$first": "$name" },
    "combined": { "$push": "$combined" }
  }},
  { "$project": {
    "project_id": 1,
    "updated_at": 1,
    "created_at": 1,
    "owner": 1,
    "name": 1,
    "uploaded_files": {
      "$filter": {
        "input": "$combined",
        "as": "cf",
        "cond": { "$eq": [ "$$cf.type", "uploaded_files" ] }
      }    
    },
    "file_history": {
      "$filter": {
        "input": "$combined",
        "as": "cf",
        "cond": { "$eq": [ "$$cf.type", "file_history" ] }
      }    
    }
  }}
])

Singkatnya

  1. Satukan kedua larik di sumber dan beri tag, lalu $unwind pertama

  2. Lakukan $lookup pada detail gabungan dan $unwind itu

  3. Lakukan $lookup di sumber asing lainnya dan $unwind itu

  4. $group dokumen kembali bersama-sama dengan satu larik.

  5. $filter dengan bidang "nama tag" atau "ketik" yang kami tambahkan ke "pisahkan" array.

Anda dapat mengikuti jenis proses yang sama hanya dengan menggunakan $unwind pada setiap array, kemudian lakukan "join" dan grouping kembali. Tapi sebenarnya itu membutuhkan lebih banyak langkah, daripada sekadar "menggabungkan" sejak awal.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. menginstal driver Java MongoDB

  2. Apakah MongoDB menyediakan cara untuk menghasilkan nilai berurutan?

  3. mengatur nilai bidang hash mongoid

  4. Cara mengatur volume data docker mongo

  5. Tambahkan bidang baru ke setiap dokumen dalam koleksi MongoDB