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

Mongodb tìm bên trong mảng phụ

Bạn đang đi đúng hướng, nhưng có một số điều cần lưu ý ở đây, ngoài phần các mảng lồng nhau (và đặc biệt là với các khóa ẩn danh) không phải là cách tuyệt vời để lưu trữ mọi thứ, nhưng miễn là bạn luôn biết vị trí thì điều đó sẽ ổn một cách hợp lý.

Có sự khác biệt rõ ràng giữa các tài liệu phù hợp và khớp với "các phần tử của mảng" . Mặc dù giá trị hiện tại của bạn thực sự không khớp (giá trị tìm kiếm của bạn không nằm trong giới hạn của tài liệu), nhưng nếu giá trị thực sự hợp lệ, truy vấn của bạn sẽ khớp chính xác với "tài liệu" ở đây, chứa một phần tử phù hợp trong mảng.

"Tài liệu" chứa tất cả của các phần tử mảng, ngay cả những phần tử không khớp, nhưng điều kiện cho biết "tài liệu" không khớp, vì vậy nó được trả về. Nếu bạn chỉ muốn các "phần tử" phù hợp sau đó sử dụng .aggregate() thay vào đó:

    db.infos.aggregate([
        // Still match the document
        { "$match": { 
            "info": { 
                "$elemMatch": { "0": {"$gte": 1399583285000} }
            }
        }},

        // unwind the array for the matched documents
        { "$unwind": "$info" },

        // Match only the elements
        { "$match": { "info.0": { "$gte": 1399583285000 } } },

        // Group back to the original form if you want
        { "$group": {
            "_id": "$_id",
            "info": { "$push": "$info" }
        }}

    ])

Và điều đó chỉ trả về các phần tử phù hợp với điều kiện:

{
    "_id" : ObjectId("536c1145e99dc11e65ed07ce"),
    "info" : [
            [
                    1399583285000,
                    20.13
            ],
            [
                    1399583286000,
                    20.13
            ]
    ]
}

Hoặc tất nhiên nếu bạn chỉ mong đợi một phần tử phù hợp, sau đó bạn có thể chỉ cần sử dụng phép chiếu với .find() **:

db.infos.find(
    {
       "info":{
          "$elemMatch":{
             "0": {
                "$gt": 1399583285000
             }
          }
       }
    },
    {
        "info.$": 1
    }
)

Nhưng với một thuật ngữ như $gt bạn có khả năng nhận được nhiều lần truy cập trong một tài liệu vì vậy phương pháp tổng hợp sẽ an toàn hơn khi xem xét rằng $ vị trí toán tử sẽ chỉ trả về đầu tiên phù hợp.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tính nguyên tử, cô lập và đồng thời trong MongoDB

  2. Làm cách nào để tắt thông báo nhật ký MongoDB trong bảng điều khiển?

  3. MongoDB forEach ()

  4. Mongoose:findOneAndUpdate không trả về tài liệu cập nhật

  5. Tổng hợp MongoDB với tổng giá trị mảng