2013-11-21 12 views
6

Vì vậy, tôi thực sự mới với MongoDB và tài liệu lưu trữ tài liệu. Tôi đang gặp khó khăn khi cố gắng tìm ra giải pháp thanh lịch và hiệu quả nhất để thực hiện những việc sau:Cách hiệu quả nhất để có được tất cả giá trị cho một trường trong MongoDB & Node.js

Tôi có một bộ sưu tập được gọi là kiểm tra. Trong mỗi bài kiểm tra có các hành động với một chủ sở hữu trường. Xem dưới đây:

{ 
"_id" : ObjectId("528c731a810761651c00000f"), 
"actions" : [ 
    { 
     "action" : "6784", 
     "owner" : "MERCHAND_1", 
     "_id" : ObjectId("528c7292810761651c00000e") 
    }, 
    { 
     "action" : "1", 
     "owner" : "MERCHAND_1", 
     "_id" : ObjectId("528c7292810761651c00000d") 
    }, 
    { 
     "action" : "1358", 
     "owner" : "MERCHAND_2", 
     "_id" : ObjectId("528c7292810761651c00000c") 
    } 
], 
"name" : "Test 1", 
"product" : ObjectId("528bc4b3a0f5430812000010") 

}

Làm thế nào tôi có thể có một danh sách (mảng) của mỗi giá trị chủ sở hữu khác nhau sử dụng Node.js & MongoDB (Tôi đang sử dụng lái xe cầy mangut). Có tốt hơn khi làm điều đó trên phía mongoside hoặc node.js không? Nếu ví dụ tôi chạy các chức năng trên bàn trước, nó sẽ trả về:

[ 
    { 
     "owner":"MERCHAND_1" 
    }, 
    { 
     "owner":"MERCHAND_2" 
    } 
] 

Trả lời

7

Bạn có thể làm điều này với MongoDB sử dụng lệnh

db.runCommand({ 
    distinct: 'tests', 
    key: 'actions.owner' 
}); 

mang đến cho bạn

{ 
    "values" : [ 
    "MERCHAND_1", 
    "MERCHAND_2" 
    ], 
    "stats" : {...}, 
    "ok" : 1 
} 

này sẽ bao gồm tất cả tài liệu trong số tests bộ sưu tập. Tuy nhiên, nếu bạn chỉ muốn kiểm tra một tài liệu, bạn có thể viết lại lệnh dưới dạng

db.runCommand({ 
    distinct: 'tests', 
    key: 'actions.owner', 
    query: { _id: ObjectId("528c731a810761651c00000f") } 
}); 
+0

Cảm ơn bạn đây là tất cả những gì tôi cần biết. Sự khác biệt giữa runCommand và gọi trực tiếp đến chức năng riêng biệt là gì? –

+0

Phương thức 'db.collection.distinct()' cung cấp một trình bao bọc xung quanh lệnh 'distinct'. Nó thực sự gọi lệnh trong nền, nhưng không trả về thuộc tính 'stats' hoặc' ok'. – Travis

11

MongoDB hỗ trợ một lệnh distinct để làm điều này. Bạn có thể sử dụng ký hiệu chấm để nhắm mục tiêu các trường trong mảng như trong trường hợp này. Trong vỏ:

db.test.distinct('actions.owner') 

kết quả đầu ra:

[ 
    "MERCHAND_1", 
    "MERCHAND_2" 
] 
+0

Thật tuyệt vời. Cảm ơn bạn. –

Các vấn đề liên quan