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

MongoDB:Tổng hợp sử dụng $ cond với $ regex

CẬP NHẬT: Bắt đầu với MongoDB v4.1.11, cuối cùng dường như có một giải pháp tốt cho sự cố của bạn được ghi lại tại đây .

Câu trả lời ban đầu:

Như tôi đã viết trong các nhận xét ở trên, $regex không hoạt động bên trong $cond như bây giờ. Có một vé JIRA đang mở cho điều đó nhưng nó, err, tốt, mở ...

Trong trường hợp cụ thể của bạn, tôi có xu hướng đề xuất bạn giải quyết chủ đề đó ở phía khách hàng trừ khi bạn đang xử lý một lượng lớn dữ liệu đầu vào mà bạn sẽ luôn chỉ trả về các tập hợp con nhỏ. Đánh giá theo truy vấn của bạn, có vẻ như bạn luôn truy xuất tất cả tài liệu vừa được phân loại thành hai nhóm kết quả ("Có" và "Không").

Nếu bạn không muốn hoặc không thể giải quyết chủ đề đó ở phía máy khách, thì đây là thứ sử dụng $ facet (MongoDB> =v3.4 bắt buộc) - nó không quá nhanh cũng không quá đẹp nhưng nó có thể giúp bạn bắt đầu.

db.captions.aggregate([{
    $facet: { // create two stages that will be processed using the full input data set from the "captions" collection
        "CallToActionYes": [{ // the first stage will...
            $match: { // only contain documents...
                "plainText": /leave\sa\scomment/i // that are allowed by the $regex filter (which could be extended with multiple $or expressions or changed to $in/$nin which accept regular expressions, too)
            }
        }, {
            $addFields: { // for all matching documents...
                "CallToAction": "Yes" // we create a new field called "CallsToAction" which will be set to "Yes"
            }
        }],
        "CallToActionNo": [{ // similar as above except we're doing the inverse filter using $not
            $match: {
                "plainText": { $not: /leave\sa\scomment/i }
            }
        }, {
            $addFields: {
                "CallToAction": "No" // and, of course, we set the field to "No"
            }
        }]
    }
}, {
    $project: { // we got two arrays of result documents out of the previous stage
        "allDocuments" : { $setUnion: [ "$CallToActionYes", "$CallToActionNo" ] } // so let's merge them into a single one called "allDocuments"
    }
}, {
    $unwind: "$allDocuments" // flatten the "allDocuments" result array
}, {
    $replaceRoot: { // restore the original document structure by moving everything inside "allDocuments" up to the top
        newRoot: "$allDocuments"
    }
}, {
    $project: { // include only the two relevant fields in the output (and the _id)
        "videoId": 1,
        "CallToAction": 1
    }
}])

Như mọi khi với khung tổng hợp, nó có thể giúp loại bỏ các giai đoạn riêng lẻ khỏi phần cuối của quy trình và chạy truy vấn từng phần để hiểu được những gì từng giai đoạn riêng lẻ thực hiện.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tài liệu về các lời hứa của Mongoose cho biết các truy vấn không phải là lời hứa?

  2. Không thể kết nối với mongodb bằng ip máy

  3. Cập nhật MongoDB:Tạo trường mới dựa trên trường hiện có hoặc cập nhật tại chỗ

  4. Hiển thị hình ảnh được lưu trữ trong Mongo (GridFS) với Node + Jade + Express

  5. mongoDB upert trên mảng