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

Sắp xếp cố định động trong Mongo cho một giá trị hoặc danh sách đơn giản

Không thể tái tạo lỗi của bạn nhưng bạn có một vài "lỗi chính tả" trong câu hỏi của mình nên tôi không thể chắc chắn bạn thực sự mắc phải lỗi gì.

Nhưng giả sử bạn thực sự đang làm việc với MongoDB 2.6 trở lên thì bạn có thể muốn có $setIntersection hoặc $setIsSubset toán tử thay vì $setUnion . Các toán tử đó ngụ ý "khớp" nội dung của mảng mà chúng được so sánh với, trong đó $setUnion chỉ cần kết hợp mảng được cung cấp với mảng hiện có:

db.people.aggregate([
    { "$project": {
        "first_name": 1,
        "last_name": 1,
        "sticky": { 
            "$size": { 
                "$setIntersection": [ "$offices", [ "FL", "SC" ]] 
            }
        },
        "offices": 1
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

Trong các phiên bản trước mà bạn không có đặt toán tử đó bạn chỉ đang sử dụng $unwind để làm việc với mảng và cùng một loại $cond hoạt động như trước trong $group để mang tất cả trở lại với nhau:

db.people.aggregate([
    { "$unwind": "$offices" },
    { "$group": {
        "_id": "$_id",
        "first_name": { "$first": "$first_name" },
        "last_name": { "$first": "$last_name",
        "sticky": { "$sum": { "$cond": [
            { "$or": [
                { "$eq": [ "$offices": "FL" ] },
                { "$eq": [ "$offices": "SC" ] },
            ]},
            1,
            0
        ]}},
        "offices": { "$push": "$offices" }
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

Nhưng bạn chắc chắn đã đi đúng hướng. Chỉ cần chọn hoạt động được thiết lập phù hợp hoặc phương pháp khác để đáp ứng nhu cầu chính xác của bạn.

Hoặc vì bạn đã đăng theo cách của mình để đạt được những gì bạn muốn, nên cách tốt hơn để viết loại "đối sánh theo thứ tự" đó là:

db.people.aggregate([
    { "$project": {
        "first_name": 1,
        "last_name": 1,
        "sticky": { "$cond": [
            { "$anyElementTrue": {
                "$map": {
                    "input": "$offices",
                    "as": "o",
                    "in": { "$eq": [ "$$o", "FL" ] }
                }
            }},
            2,
            { "$cond": [
                { "$anyElementTrue": {
                    "$map": {
                        "input": "$offices",
                        "as": "o",
                        "in": { "$eq": [ "$$o", "SC" ] }
                    }
                }},
                1,
                0
            ]}
        ]},
        "offices": 1
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

Và điều đó sẽ ưu tiên cho nó các tài liệu có "văn phòng" chứa "FL" thay vì "SC" và do đó, sau đó là tất cả các tài liệu khác và thực hiện hoạt động trong một trường duy nhất. Điều đó cũng sẽ rất dễ dàng để mọi người biết cách tóm tắt nó vào biểu mẫu bằng cách sử dụng $unwind trong các phiên bản trước mà không có các toán tử đã đặt. Nơi bạn chỉ cần cung cấp giá trị "trọng số" cao hơn cho các mục bạn muốn ở trên cùng bằng cách lồng $cond tuyên bố.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách thực thi tài liệu nhúng duy nhất trong mongoid

  2. Định cấu hình GridFS Chunksize trong MongoDB

  3. MongoDB trên Android

  4. Mảng truy vấn các tài liệu lồng nhau cho giá trị cao nhất của trường

  5. Node js / MongoDB mảng thiết lập bản sao trong javascript