2010-02-15 29 views
15

giả sử rằng tôi có một mô hình BlogPost với các tài liệu Comment được nhúng không đến nhiều. tôi có thể truy vấn và có MongoDB trả lại chỉComment các đối tượng khớp với thông số truy vấn của tôi không?MongoDB truy vấn để chỉ trả về tài liệu được nhúng

ví dụ: db.blog_posts.find({"comment.submitter": "some_name"}) chỉ trả lại danh sách nhận xét.

chỉnh sửa: một ví dụ:

import pymongo 

connection = pymongo.Connection() 
db = connection['dvds'] 

db['dvds'].insert({'title': "The Hitchhikers Guide to the Galaxy", 
        'episodes': [{'title': "Episode 1", 'desc': "..."}, 
           {'title': "Episode 2", 'desc': "..."}, 
           {'title': "Episode 3", 'desc': "..."}, 
           {'title': "Episode 4", 'desc': "..."}, 
           {'title': "Episode 5", 'desc': "..."}, 
           {'title': "Episode 6", 'desc': "..."}]}) 

episode = db['dvds'].find_one({'episodes.title': "Episode 1"}, 
           fields=['episodes']) 

trong ví dụ này, episode là:

{u'_id': ObjectId('...'), 
u'episodes': [{u'desc': u'...', u'title': u'Episode 1'}, 
       {u'desc': u'...', u'title': u'Episode 2'}, 
       {u'desc': u'...', u'title': u'Episode 3'}, 
       {u'desc': u'...', u'title': u'Episode 4'}, 
       {u'desc': u'...', u'title': u'Episode 5'}, 
       {u'desc': u'...', u'title': u'Episode 6'}]} 

nhưng tôi chỉ muốn:

{u'desc': u'...', u'title': u'Episode 1'} 
+0

"Tương lai" của câu trả lời được chấp nhận hiện là quá khứ, vì khung tổng hợp đã tồn tại. Tôi trả lời làm thế nào để làm điều đó. –

Trả lời

2

Các MongoDB javascript vỏ được ghi lại tại http://docs.mongodb.org/manual/reference/method/

Nếu bạn muốn nhận được lại chỉ các lĩnh vực cụ thể của một đối tượng, bạn có thể sử dụng

db.collection.find({ }, {fieldName:true}); 

Nếu, mặt khác, bạn đang tìm kiếm cho các đối tượng có chứa một lĩnh vực cụ thể, bạn có thể kiện

db.collection.find({ fieldName : { $exists : true } }); 
+0

Tôi đã cố gắng làm rõ câu hỏi của mình bằng ví dụ trong bài đăng gốc. cảm ơn. – Carson

0

Nhìn vào db.eval:

Bạn nên làm điều gì đó như:

episode = connection['dvds'].eval('function(title){ 
    var t = db.dvds.findOne({"episodes.title" : title},{episodes:true}); 
    if (!t) return null; 
    for (var i in t.episodes) if (t.episodes[i].title == title) return t.episodes[i]; 
}', "Episode 1"); 

để lọc các tập phim sẽ được trên một server-side.

1

trận đấu đơn giản hơn:

db['dvd'].find_one({'episodes.title': "Episode 1"},{'episodes.title': true}) 

Query:

coll.find(criteria, fields); 

Nhận ruộng chỉ cụ thể từ các đối tượng. Ví dụ:

coll.find({}, {name:true}); 

http://www.mongodb.org/display/DOCS/dbshell+Reference

7

Tôi nghĩ rằng những gì bạn muốn là thế này:

print db.dvds.aggregate([ 
    {"$unwind": "$episodes"}, # One document per episode 
    {"$match": {"episodes.title": "Episode 1"} }, # Selects (filters) 
    {"$group": {"_id": "$_id", # Put documents together again 
       "episodes": {"$push": "$episodes"}, 
       "title": {"$first": "$title"} # Just take any title 
      } 
    }, 
])["result"] 

Sản lượng (ngoài khoảng trắng) là:

[ { u'episodes': [ { u'title': u'Episode 1', 
        u'desc': u'...' 
        } 
       ], 
    u'_id': ObjectId('51542645a0c6dc4da77a65b6'), 
    u'title': u'The Hitchhikers Guide to the Galaxy' 
    } 
] 

Nếu bạn muốn nhận được thoát khỏi số u"_id", nối thêm đường ống với:

{"$project": {"_id": 0, 
       "episodes": "$episodes", 
       "title": "$title"} 
       } 
0

Tôi cũng gặp phải vấn đề tương tự. Cách tôi làm là sử dụng chức năng tổng hợp.Đầu tiên hãy thư giãn và sau đó kết hợp nó.

db.dvds.aggregate([{$unwind:"$episodes"},{$match:{"episodes.title":"Episode 1"}}]) 

Các kết quả sẽ như thế nào

{ "_id" : ObjectId("5a129c9e6944555b122c8511"), 
    "title" : "The Hitchhikers Guide to the Galaxy", 
    "episodes" : { "title" : "Episode 1", "desc" : "..." } } 

Đó không phải là hoàn hảo, nhưng sau đó bạn có thể chỉnh sửa nó bằng python.

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