2011-09-26 15 views
5

Tôi có một kỷ lục trong bộ sưu tập của tôi và tôi muốn lấy các chi tiết của người có id là 1. Nhưng tôi nhận được các chi tiết cho 2times thay vì 1.Làm thế nào để tìm bản ghi phù hợp trong mongodb?

db.mycollection.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}, { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]}) 

Sau đó chạy

> db.mycollection.findOne({"person.id":1},{"person.details":1,"_id":0}) 

kết quả là:

{ 
     "person" : 
       [ 
        { 
         "details" : 
         { 
         "name" : "Aswini", 
         "Age" : 10 
         } 
        }, 
        { 
         "details" : 
         { 
         "name" : "Mahesh", 
         "Age" : 11 
         } 
        } 
       ] 
    } 

Nhưng tôi cần như sau:

{ 
    "person" : [ 
       { 
       "details" : { 
          "name" : "Aswini", 
          "Age" : 10 
         } 
       } 
      ] 
    } 

Không hiểu nơi nào đang phạm sai lầm. Xin vui lòng cần sự giúp đỡ của bạn. Đang sử dụng MongoDB, Java

Trả lời

0

person là một mảng. Nếu bạn muốn nhận được phần tử đầu tiên của mảng này, bạn nên sử dụng $slice

db.mycollection.findOne({"person.id":1},{"person":{$slice:[0,1]},"_id":0}) 
+0

sai của nó. op không muốn phần tử thứ 1, anh ta muốn lấy mảng phụ phù hợp bất kể vị trí. nếu tài liệu phụ person.id nằm ở vị trí cuối cùng phía trên truy vấn sẽ không quấy rối – RameshVel

+0

Bạn hoàn toàn đúng. Tôi muốn mảng phụ không phân biệt chỉ số của nó. Xin vui lòng giúp đỡ nếu bạn có bất kỳ giải pháp am a newbee để mongodb – aswininayak

3

Đây là hành vi lọc tài liệu đa mức độ nhúng, thông thường các bộ lọc phù hợp sẽ trả lại toàn bộ tài liệu, không phải là tập con.

Thường là positional operator $ được sử dụng để khớp với tài liệu phụ trong updates. Nhưng tính năng này chưa được triển khai trong các bộ định danh trả về.

Đã xảy ra sự cố nổi bật ở mongo Support for positional ($) operator in fields to return specifier. (Xin vui lòng đăng nhập để bình chọn nếu bạn thực sự cần tính năng)

Vì vậy, bạn phải redesgin giản đồ của bạn để xử lý này, có thể là như thế này

db.test.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}]}) 
db.test.insert({"person" : [ { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]}) 

db.test.find({"person.id":1},{'person.details':1}) 
Các vấn đề liên quan