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

Tìm bản sao bên trong mảng mà không cần $ unwind

Bạn có thể sử dụng $ range để tạo mảng số từ 1 thành n ở đâu n $ size của adds . Sau đó, bạn có thể "lặp" qua các con số đó và kiểm tra xem adds không tại index ( $ arrayElemAt ) tồn tại ở đâu đó trước index nếu có thì nó nên được coi là một bản sao. Bạn có thể sử dụng $ indexOfArray để kiểm tra xem phần tử có tồn tại trong mảng chỉ định 0 và index hay không dưới dạng phạm vi tìm kiếm.

Sau đó, bạn chỉ cần sử dụng $project $ map để thay thế các chỉ mục bằng các phần tử thực tế. Bạn cũng có thể thêm $ setUnion để tránh trùng lặp trong tập kết quả cuối cùng.

db.users.aggregate([
    {
        $addFields: {
            duplicates: {
                $filter: {
                    input: { $range: [ 1, { $size: "$adds" } ] },
                    as: "index",
                    cond: {
                        $ne: [ { $indexOfArray: [ "$adds", { $arrayElemAt: [ "$adds", "$$index" ]  }, 0, "$$index" ] }, -1 ]
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 1,
            adds: {
                $setUnion: [ { $map: { input: "$duplicates", as: "d", in: { $arrayElemAt: [ "$adds", "$$d" ] } } }, [] ]
            }
        }
    }
])

Bản in:

{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB có thể được lưu trữ trong quá trình không?

  2. Tìm bản ghi có trường trong tài liệu lồng nhau khi trường mẹ không được biết

  3. mongodb bị treo sau khi tắt đột ngột

  4. Nhóm MongoDB theo Chức năng

  5. Lọc tài liệu theo khoảng cách được lưu trữ trong tài liệu với $ gần