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

Truy vấn mảng MongoDB và sắp xếp với các phần tử phù hợp nhất

Bạn có thể làm điều này với khung tổng hợp, mặc dù nó không dễ dàng. Rắc rối nằm ở chỗ không có $in toán tử như một phần của khung tổng hợp. Vì vậy, bạn phải kết hợp theo chương trình từng mục trong mảng, điều này sẽ rất lộn xộn. chỉnh sửa :được sắp xếp lại để kết quả khớp là đầu tiên, trong trường hợp $in giúp bạn lọc ra một phần tốt.

db.test.aggregate(
  {$match:{"array.1":{$in:[100, 140,80]}}}, // filter to the ones that match
  {$unwind:"$array.1"}, // unwinds the array so we can match the items individually
  {$group: { // groups the array back, but adds a count for the number of matches
    _id:"$_id", 
    matches:{
      $sum:{
        $cond:[
          {$eq:["$array.1", 100]}, 
          1, 
          {$cond:[
            {$eq:["$array.1", 140]}, 
            1, 
            {$cond:[
              {$eq:["$array.1", 80]}, 
              1, 
              0
              ]
            }
            ]
          }
          ]
        }
      }, 
    item:{$first:"$array.item"}, 
    "1":{$push:"$array.1"}
    }
  }, 
  {$sort:{matches:-1}}, // sorts by the number of matches descending
  {$project:{matches:1, array:{item:"$item", 1:"$1"}}} // rebuilds the original structure
);

kết quả đầu ra:

{
"result" : [
    {
        "_id" : ObjectId("50614c02162d92b4fbfa4448"),
        "matches" : 2,
        "array" : {
            "item" : 3,
            "1" : [
                100,
                90,
                140
            ]
        }
    },
    {
        "_id" : ObjectId("50614bb2162d92b4fbfa4446"),
        "matches" : 1,
        "array" : {
            "item" : 1,
            "1" : [
                100,
                130,
                255
            ]
        }
    }
],
"ok" : 1
}

Bạn có thể để lại matches trường ra khỏi kết quả nếu bạn bỏ nó ra khỏi $project ở phần cuối.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để thực hiện các lệnh MongoDB không phải CRUD và không cơ bản trong ObjCMongoDB?

  2. Cập nhật Mongo bên trong một mảng lồng nhau kép

  3. Cách thích hợp để thêm trường vào bộ sưu tập người dùng trong sao băng

  4. Lưu các mục trong Mongoose để lặp lại với các phương pháp lược đồ

  5. Làm cách nào để tải xuống tệp được lưu trữ bằng GridFS và được trả lại bằng GraphQL trong React / Javascript Client?