MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongo loại bỏ các bản sao trong mảng đối tượng dựa trên trường

Vâng, bạn có thể nhận được kết quả mong muốn theo 2 cách.

Cổ điển

Làm phẳng - Loại bỏ các bản sao (chọn lần xuất hiện đầu tiên) - Nhóm theo

db.collection.aggregate([
  {
    $unwind: "$values"
  },
  {
    $group: {
      _id: "$values.id",
      values: {
        $first: "$values"
      },
      id: {
        $first: "$_id"
      },
      name: {
        $first: "$name"
      }
    }
  },
  {
    $group: {
      _id: "$id",
      name: {
        $first: "$name"
      },
      values: {
        $push: "$values"
      }
    }
  }
])

MongoPlayground

Hiện đại

Chúng tôi cần sử dụng $ giảm nhà điều hành.

Mã giả:

Các giá trị
values : {
  var tmp = [];
  for (var value in values) {
      if !(value.id in tmp)
        tmp.push(value);
  }
  return tmp;
}
db.collection.aggregate([
  {
    $addFields: {
      values: {
        $reduce: {
          input: "$values",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              {
                $cond: [
                  {
                    $in: [
                      "$$this.id",
                      "$$value.id"
                    ]
                  },
                  [],
                  [
                    "$$this"
                  ]
                ]
              }
            ]
          }
        }
      }
    }
  }
])

MongoPlayground



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lọc quần thể lồng nhau là MongoDB

  2. Django + MongoDB vs Node.js + MongoDB

  3. Làm thế nào để tính toán sự khác biệt giữa các giá trị của các tài liệu khác nhau bằng cách sử dụng tổng hợp mongo?

  4. (Làm thế nào) có thể tổng hợp () phá vỡ một chỉ mục?

  5. Cách sử dụng toán tử $ in trong mongodb với hai trường trong java