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

Hoàn tác Thư giãn tổng hợp trong mongodb

Tất nhiên, bạn có thể chỉ cần sử dụng $ push $ first trong $ group để đưa tài liệu trở lại như cũ:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$unwind":"$matchData"},
    { "$match":{
        "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$group": {
        "_id": "$_id",
        "venueId": { "$first": "$venueId" },
        "companyId": { "$first": "$companyId" },
        "cardTypeId": { "$first": "$cardTypeId" },
        "matchData": { "$push": "$matchData" }
    }}
])

Nhưng có lẽ bạn chỉ nên sử dụng $ filter với MongoDB 3.2 ở vị trí đầu tiên:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$project": {
        "venueId": 1,
        "companyId": 1,
        "cardTypeId": 1,
        "matchData": { 
            "$filter": {
                "input": "$matchData",
                "as": "match",
                "cond": {
                   "$or": [
                       { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                   ]
                }
            }
        }
    }}
])

Và nếu bạn có ít nhất MongoDB 2.6, bạn vẫn có thể sử dụng $ map $ setDifference thay vào đó:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$project": {
        "venueId": 1,
        "companyId": 1,
        "cardTypeId": 1,
        "matchData": { 
            "$setDifference": [
                { "$map": {
                    "input": "$matchData",
                    "as": "match",
                    "in": {
                        "$cond": [
                           { "$or": [
                              { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                           ]},
                            "$$match",
                            false
                        ]
                    }
                }},
                [false]
            ]
        }
    }}
])

Điều đó hoàn toàn ổn khi mọi phần tử mảng đã có một số nhận dạng "duy nhất", vì vậy thao tác "set" chỉ loại bỏ false giá trị từ $ map .

Cả hai cách đó đều là cách để "lọc" nội dung khỏi một mảng mà không thực sự sử dụng $ thư giãn

N.B :Không chắc liệu bạn có thực sự hiểu $ in được sử dụng để khớp với "danh sách các điều kiện" thay vì bắt buộc phải khớp trên các mảng. Vì vậy, nói chung điều kiện chỉ có thể là:

 "matchData.matchId": ObjectId("57175c25561d87001e666d12")

Nơi bạn thực sự chỉ có một giá trị duy nhất để so khớp. Bạn sử dụng $ in $ hoặc khi bạn có một "danh sách" các điều kiện. Bản thân các mảng không tạo ra sự khác biệt đối với toán tử được yêu cầu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tại sao MongoDB không phản hồi trong quá trình kiểm tra tải?

  2. Lưu trữ tệp hình ảnh ở dạng dữ liệu nhị phân trong lược đồ mongoose và hiển thị hình ảnh ở dạng html

  3. Truy vấn mongoDB chậm một cách kỳ lạ trên bộ sưu tập nhỏ trong cơ sở dữ liệu đơn giản nhưng lớn

  4. MongoDB sẽ không bắt đầu sau sự cố máy chủ

  5. MongoDB C # - Lấy BsonDocument cho một phần tử không tồn tại