2013-02-28 31 views
7

Tôi có thể tham chiếu giá trị của từng giá trị thuộc tính trong đường dẫn tập hợp MongoDB bằng toán tử '$'. Nhưng, làm cách nào để truy cập (tham chiếu) toàn bộ tài liệu?Tham chiếu toàn bộ tài liệu trong Đường dẫn Tập hợp MongoDB


CẬP NHẬT: Ví dụ được cung cấp cho kịch bản giải thích.

Đây là ví dụ về những gì tôi đang cố gắng làm. Tôi có một bộ sưu tập các tweet. Và mỗi tweet đều có một cụm 'thành viên', là một dấu hiệu cho thấy cụm từ mà một tweet cụ thể thuộc về.

{ 
    "_id" : "5803519429097792069", 
    "text" : "The following vehicles/owners have been prosecuted by issuing notice on the basis of photographs on dated... http://t.co/iic1Nn85W5", 
    "oldestts" : "2013-02-28 16:11:32.0", 
    "firstTweetTime" : "4 hours ", 
    "id" : "307161122191065089", 
    "isLoc" : true, 
    "powertweet" : true, 
    "city" : "new+delhi", 
    "latestts" : "2013-02-28 16:35:05.0", 
    "no" : 0, 
    "ts" : 1362081807.9693, 
    "clusters" : [ 
     { 
      "participationCoeff" : 1, 
      "clusterID" : "5803519429097792069" 
     } 
    ], 
    "username" : "dtptraffic", 
    "verbSet" : [ 
     "date", 
     "follow", 
     "prosecute", 
     "have", 
     "be" 
    ], 
    "timestamp" : "4 hours ", 
    "entitySet" : [ ], 
    "subCats" : { 
     "Generic" : [ ] 
    }, 
    "lang" : "en", 
    "fns" : 18.35967, 
    "url" : "url|109|131|http://fb.me/2CeaI7Vtr", 
    "cat" : [ 
     "Generic" 
    ], 
    "order" : 7 
} 

Vì, có vài trăm nghìn tweet trong bộ sưu tập của tôi, tôi muốn nhóm tất cả các tweet theo 'clusters.clusterID'. Về cơ bản, tôi muốn viết một truy vấn như sau:

db.tweets.aggregate (
{ $group : { _id : '$clusters.clusterID', 'members' : {$addToSet : <????> } } } 
) 

Tôi muốn truy cập tài liệu hiện tại đang xử lý và tham chiếu đến nơi tôi đã đưa vào truy vấn ở trên. Có ai biết làm thế nào để làm điều này?

+1

bạn có một ví dụ về những gì bạn đang cố gắng để làm gì? – RickyA

+1

Tóm lại - không, không có cách nào để làm điều này (sẽ có nếu bạn biết tất cả các tên chính, nhưng đó không phải là hữu ích). –

+0

bạn có thể làm điều này trong khung làm việc nghiêm túc nếu bạn sẵn sàng giải quyết cho một bộ trường cố định của tài liệu gốc. –

Trả lời

-1

Tôi nghĩ MapReduce hữu ích hơn cho tác vụ này.

Như được viết trong các nhận xét của Asya Kamsky, ví dụ của tôi không chính xác cho mongodb, vui lòng sử dụng official docs cho mongoDB.

+0

bạn nói đúng rằng bản đồ/giảm có thể làm được điều này, nhưng những gì bạn đưa ra ở đây sẽ không hoạt động. Bản đồ của bạn hơi sai và chức năng giảm của bạn dường như bị thiếu hoàn toàn. –

+0

đó không phải là cách hoạt động của bản đồ/giảm. Chức năng giảm của bạn phải trả lại cùng một định dạng mà chức năng bản đồ của bạn phát ra và nó cũng có thể được gọi nhiều lần. Bài kiểm tra của bạn có thể đã đưa ra câu trả lời "đúng" cho một số bài kiểm tra nhỏ, nhưng nó sẽ không hoạt động chính xác trên dữ liệu thực. –

+1

xem trang tài liệu cho mapReduce. http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/# requirements-for-the-reduce-function liệt kê cả hai sự kiện đó (cộng với việc giảm sẽ không được gọi ở tất cả các khóa ánh xạ chỉ xảy ra một lần) –

2

Hiện nay chưa có cơ chế để truy cập vào tài liệu đầy đủ trong khuôn khổ hợp, nếu bạn chỉ cần một tập hợp con của các lĩnh vực, bạn có thể làm:

db.tweets.aggregate([ {$group: { _id: '$clusters.clusterID', 
            members: {$addToSet : 
             { user: "$user", 
             text: "$text", // etc for subset 
                 // of fields you want 
             } 
            } 
           } 
         } ]) 

Đừng quên với một vài trăm ngàn tweets, tập hợp tài liệu đầy đủ sẽ chạy bạn vào giới hạn 16MB cho tài liệu kết quả khung kết quả trả về.

Bạn có thể làm điều này thông qua MapReduce như thế này:

var m = function() { 
    emit(this.clusters.clustersID, {members:[this]}); 
} 

var r = function(k,v) { 
    res = {members: [ ] }; 
    v.forEach(function (val) { 
    res.members = val.members.concat(res.members); 
    }); 
    return res; 
} 

db.tweets.mapReduce(m, r, {out:"output"}); 
+0

Tôi có cùng vấn đề và BatScream cung cấp giải pháp sau. http://stackoverflow.com/questions/34404834/how-to-group-and-select-document-corresponding-to-max-within-each-group-in-mongo?noredirect=1#comment56552218_34404834. Anh đề xuất truy cập toàn bộ tài liệu qua $$ ROOT – user1700890

+0

$$ ROOT được giới thiệu ở phiên bản 2.6 và không có sẵn tại thời điểm câu hỏi/câu trả lời này. https://jira.mongodb.org/browse/SERVER-9840 –

9

Trong các tài liệu tôi thấy rằng sự biểu hiện $$ROOT giải quyết vấn đề này.

Từ DOC: http://docs.mongodb.org/manual/reference/operator/aggregation/group/#group-documents-by-author

+1

câu hỏi này được hỏi khi MongoDB 2.2 là hiện tại - $$ ROOT đã được thêm vào trong phiên bản 2.6 (đầu 2014) –

+1

có thể bạn có thể trả lời [câu hỏi này của tôi] (http://stackoverflow.com/questions/39288087/mongodb-collection-with-different-language-texts-select-localized-texts). Vấn đề là tôi muốn lấy bản thân tài liệu, không phải là một tài liệu phụ, loại '{$ group: $$ ROOT}' mà không thể, và cho thời điểm nó có thể chỉ là một subdocument: '{$ group: {_id: '$$ ROOT'}} ' – Miquel

+0

Làm thế nào để thực hiện công việc này khi sử dụng chiếu trước? – Dane411

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