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

Cách sử dụng $ in hoặc $ nin trong tổng hợp mongo $ group $ cond

So sánh trên $setIsSubset là một tùy chọn ngắn hơn $or điều kiện bạn đang sử dụng, mặc dù về cơ bản nó vẫn hợp lệ để làm những gì bạn đang làm.

Giải pháp duy nhất với $setIsSubset là mỗi đối số là một mảng vì vậy bạn cần chuyển đổi phần tử đơn lẻ thành một mảng phần tử đơn lẻ. Điều này đủ dễ dàng bằng cách sử dụng $map :

db.collectionName.aggregate([
    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$setIsSubset": [
                        { "$map": {
                            "input": ["A"],
                            "as": "el",
                            "in": "$id"
                        }},
                        [ 0,100,101,102,103,104,105 ],
                    ]},
                    1,
                    0
                ]
            }
        }
    }}    
])

Hoặc nếu bạn thích, hãy so khớp mảng đối số với giá trị đơn lẻ thay thế bằng $anyElementTrue :

db.collectionName.aggregate([
    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$anyElementTrue": { "$map": {
                        "input": [ 0,100,101,102,103,104,105 ],
                        "as": "el",
                        "in": { "$eq": [ "$$el", "$id" ] }
                    }}},
                    1,
                    0
                ]
            }
        }
    }}
])

Nơi $map là duyệt các đối số để khớp với số ít hơn là buộc số ít vào một mảng.

Và tất nhiên vì cả hai biểu mẫu về cơ bản là cung cấp true/false tới $cond thì bạn chỉ có thể đảo ngược logic với $not nếu được yêu cầu:

db.collectionName.aggregate([
    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$not": [{ "$anyElementTrue": { "$map": {
                        "input": [ 0,100,101,102,103,104,105 ],
                        "as": "el",
                        "in": { "$eq": [ "$$el", "$id" ] }
                    }}}]},
                    1,
                    0
                ]
            }
        }
    }}
])

Nó thực sự phụ thuộc vào cách bạn nhìn vào nó, nhưng chỉ đơn giản là các đối số được cung cấp thì bạn không thực sự thu được gì so với dạng ban đầu với $or . Nó có thể trông gọn gàng hơn và "dễ nhập hơn" một chút, nhưng thường thì tôi sẽ không trực tiếp "gõ" logic như vậy vào đường dẫn tổng hợp, mà là tạo phần cấu trúc đó dựa trên một danh sách đơn giản ngay từ đầu:

tức là

var failList = [ 0,100,101,102,103,104,105 ];

var orCondition = failList.map(function(el) { 
    return { "$eq": [ "$id", el ] }
})

Và sau đó chỉ sử dụng nội dung mảng được ánh xạ lại trong định nghĩa đường ống:

    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$or": orCondition },
                    1,
                    0
                ]
            }
        }
    }}
])

Dù bạn nhìn nó theo cách nào, hãy nhớ rằng tất cả chỉ là cấu trúc dữ liệu và bạn có các quy trình cơ bản để thao tác. Cả trong quá trình xử lý đường ống và cả trong quá trình xây dựng đường ống.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách sử dụng sự kiện giữ logic mongodb khỏi trình xử lý yêu cầu node.js

  2. Mongodb - cập nhật một phần số lượng tài liệu

  3. Mongoose Đang cố gắng mở kết nối chưa được đóng kín

  4. mongo:lợi nhuận không bằng count ()

  5. MongoDb giải thích không thành công:toán tử cấp cao nhất không xác định:$ query