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

Truy vấn MongoDB với nhóm điều kiện theo câu lệnh

Mã của bạn không hoạt động vì $ cond không phải là một toán tử tích lũy. Chỉ những này toán tử bộ tích lũy, có thể được sử dụng trong $group sân khấu.

Giả sử bản ghi của bạn chứa không nhiều hơn hai giá trị có thể có của source như bạn đề cập trong câu hỏi của mình, bạn có thể thêm $project có điều kiện giai đoạn và sửa đổi $group giai đoạn như,

Mã:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceA": { $first: "$source" },
                "sourceB": { $last: "$source" }
            }
        },
        {
            $project: {
                "source": {
                    $cond: [
                        { $eq: ["$sourceA", "email"] },
                        "$sourceB",
                        "$sourceA"
                    ]
                }
            }
        }
    ])

Trong trường hợp có thể có nhiều hơn hai giá trị có thể có cho nguồn, thì bạn có thể làm như sau:

  • Group bởi id , firstName , lastName và mã code . Tích lũy các giá trị duy nhất của source , sử dụng $ addToSet toán tử.
  • Sử dụng $ redact để chỉ giữ các giá trị khác với email .
  • Project các trường bắt buộc, nếu source mảng trống (tất cả các phần tử đã bị xóa), hãy thêm giá trị email cho nó.
  • Unwind trường nguồn để liệt kê nó dưới dạng một trường chứ không phải một mảng. (tùy chọn)

Mã:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceArr": { $addToSet: { "source": "$source" } }
            }
        },
        {
            $redact: {
                $cond: [
                    { $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
                    "$$PRUNE",
                    "$$DESCEND"
                ]
            }
        },
        {
            $project: {
                "source": {
                    $map: {
                        "input":
                        {
                            $cond: [
                                { $eq: [{ $size: "$sourceArr" }, 0] },
                                [{ "source": "item" }],
                                "$sourceArr"]
                        },
                        "as": "inp",
                        "in": "$$inp.source"
                    }
                }
            }
        }
    ])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tạo dữ liệu thử nghiệm cho MongoDB

  2. Trích xuất hai giá trị mảng con trong mongodb bằng $ elemMatch

  3. 3 cách trả lại mẫu tài liệu ngẫu nhiên từ bộ sưu tập MongoDB

  4. (Angular 2) Cách điền một menu thả xuống dựa trên một lựa chọn thả xuống khác

  5. nhược điểm của việc sử dụng IQueryable!