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

MongoDB:Làm thế nào để tìm hiểu xem một trường mảng có chứa một phần tử không?

[ chỉnh sửa dựa trên điều này hiện có thể thực hiện được trong các phiên bản gần đây]

[Câu trả lời đã cập nhật] Bạn có thể truy vấn theo cách sau để lấy lại tên lớp và id sinh viên chỉ khi họ đã đăng ký.

db.student.find({},
 {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})

và bạn sẽ nhận lại được những gì bạn mong đợi:

{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }

[Câu trả lời gốc] Hiện tại, bạn không thể làm những gì bạn muốn. Điều này là không may vì bạn sẽ có thể làm điều này nếu sinh viên được lưu trữ trong mảng dưới dạng một đối tượng. Trên thực tế, tôi hơi ngạc nhiên khi bạn chỉ sử dụng ObjectId () vì điều đó sẽ luôn luôn yêu cầu bạn tra cứu sinh viên nếu bạn muốn hiển thị danh sách sinh viên đã đăng ký trong một khóa học cụ thể (tra cứu danh sách Id trước sau đó tra cứu tên trong tập hợp sinh viên - hai truy vấn thay vì một!)

Nếu bạn đang lưu trữ (làm ví dụ) một Id và tên trong mảng khóa học như sau:

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
        ]
}

Khi đó truy vấn của bạn sẽ đơn giản là:

db.course.find( { }, 
                { students : 
                    { $elemMatch : 
                       { id : ObjectId("51780f796ec4051a536015d0"), 
                         name : "Sam" 
                       } 
                    } 
                } 
);

Nếu sinh viên đó chỉ đăng ký CS 101, bạn sẽ nhận lại:

{ "name" : "Literature" }
{ "name" : "Physics" }
{
    "name" : "CS 101",
    "students" : [
        {
            "id" : ObjectId("51780f796ec4051a536015cf"),
            "name" : "John"
        }
    ]
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sự khác biệt giữa Find và FindAsync

  2. Các tài liệu phụ Mongoose so với lược đồ lồng nhau

  3. Nhân bản một Tập hợp bản sao hoặc phiên bản MongoDB

  4. Xóa nhiều tài liệu khỏi mongo trong một truy vấn

  5. Truy vấn Mongodb dựa trên mục ở vị trí cụ thể trong mảng