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

Truy vấn Mongo Giá trị trường lồng nhau với khóa cha không xác định hai cấp

Bản đồ giảm cho phép bạn xử lý các khóa được đặt tên nhưng tổng hợp là cách để thực hiện các truy vấn hiệu quả.

Bạn phải lập mô hình dữ liệu dưới dạng mảng tài liệu nhúng cho khung tổng hợp.

Tôi đã cung cấp cho bạn hai lựa chọn. Bạn có thể kiểm tra chúng cho tập dữ liệu của mình và xem cái nào phù hợp hơn với bạn.

Một cái gì đó giống như

"v":[
  {
    "minute":1,
    "seconds":[
      {
        "second":54,
        "data":{
         "field1":7.373158,
         "entry_id":4635,
         "field3":0.19,
         "field2":88
       }
      }
    ]
  },
  {
    "minute":2,
    "seconds":...
  }
]

Giờ đây, bạn có thể dễ dàng truy vấn các mục có chỉ số cảm biến:"field1"> 2.

db.col.aggregate(
  [{"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$unwind":"$v"}, 
   {"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$unwind":"$v.seconds"}, 
   {"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$project":{"data":"$v.seconds.data"}}]
)

Ngoài ra, bạn có thể chia nhỏ các tài liệu theo phút. Một cái gì đó giống như

"v":[
  {
    "second":1,
    "data":{
       "field1":7.373158,
       "entry_id":4635,
       "field3":0.19,
       "field2":88
     }
  },
  {
     "second":2,
     "data":...
  }
]

Bây giờ bạn có thể truy vấn như (với chỉ mục trên v.data.field1)

db.col.aggregate(
  [{"$match":{"v.data.field1":{"$gt":2}}},
   {"$unwind":"$v"}, 
   {"$match":{"v.data.field1":{"$gt":2}}},
   {"$project":{"data":"$v.data"}}]
)

Bạn có thể truy vấn các mục có chỉ số cảm biến:"field1"> 2 và "field3"> 5

Sử dụng cấu trúc đầu tiên

db.col.aggregate(
  [{"$match":{"v":{"$elemMatch":{"seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}}}},
  {"$unwind":"$v"}, 
    {"$match":{"v.seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
  {"$unwind":"$v.seconds"}, 
  {"$project":{"data":"$v.seconds.data"}}]
)

Sử dụng cấu trúc thứ hai

db.col.aggregate(
  [{"$match":{"v.data":{$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
  {"$unwind":"$v"}, 
  {"$match":{"v.data.field1":{"$gt":2},"v.data.field3":{"$gt":5} }},
  {"$project":{"data":"$v.data"}}]
)

Bản cập nhật Mongo 3.6

$match với $expr chấp nhận biểu thức tổng hợp.

$gt > 0 - biểu thức tổng hợp để kiểm tra xem tổng của tất cả các tiêu chí giây phù hợp trong một phút lớn hơn 0

$objectToArray để chuyển đổi các khóa được đặt tên thành cặp giá trị khóa, theo sau là $filter giây trên tiêu chí đầu vào và đầu ra không có bản ghi giây phù hợp.

db.testcol.aggregate(
{"$match":{
  "$expr":{
    "$gt":[
      {"$sum":{
        "$map":{
          "input":{"$objectToArray":"$v"},
          "as":"secondsofminute",
          "in":{
            "$size":{
              "$filter":{
                "input":{"$objectToArray":"$$secondsofminute.v"},
                "as":"seconds",
                "cond":{"$gt":["$$seconds.v.field2",2]}
              }
            }
          }
        }
      }},
    0]
  }
}})

Bản cập nhật Mongo 3.4 - Thay thế $expr với $redact

db.col.aggregate(
 {"$redact":{
  "$cond":{
    "if":{
      "$gt":[
        {"$sum":{
          "$map":{
            "input":{"$objectToArray":"$v"},
            "as":"secondsofminute",
            "in":{
              "$size":{
                "$filter":{
                  "input":{"$objectToArray":"$$secondsofminute.v"},
                  "as":"seconds",
                  "cond":{"$gt":["$$seconds.v.field2",2]}
                }
              }
            }
          }
        }},
        0]
    },
   "then":"$$KEEP",
   "else":"$$PRUNE"
  }
}})



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. lưu một đối tượng có mối quan hệ hai chiều trong mongodb bằng cách sử dụng trình điều khiển c # chính thức

  2. Cách dễ dàng để tăng các phiên bản tài liệu Mongoose cho bất kỳ truy vấn cập nhật nào?

  3. Các tài liệu con mongodb có tương đương với các bộ sưu tập con của Firestore không?

  4. GroupBy Aggregation bao gồm các ngày bị thiếu trong mongo

  5. Cách triển khai máy chủ Percona cho MongoDB để có tính khả dụng cao