2013-04-02 25 views
14

Tôi đã truy vấn này:Làm thế nào để ẩn _id khỏi tập hợp?

produits = yield motor.Op(db.users.aggregate, [{"$unwind":"$pup"},{"$match":{"pup.spec.np":nomp}}, {"$group":{"_id":"$pup.spec.id","pup":{"$push":"$pup"}}}]) 

kết quả cho tôi này:

print produits 

{u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]} 

vì vậy tôi có thể làm:

prod = produits["result"] 

[{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}] 

nhưng làm thế nào để che giấu "_id" vì vậy tôi chỉ có thể nhận được

[{u'pup': [{u'avt': {u'fto': ..all the results}}]}] 

trong truy vấn bình thường tôi chỉ cần thêm một cái gì đó như {"_id":0} ở đây nó không hoạt động.

Trả lời

24

Từ tài liệu MongoDB

Bạn có thể $ chiếu các kết quả để loại trừ _id - là những gì bạn nghĩa là gì?

http://docs.mongodb.org/manual/reference/aggregation/#pipeline

Lưu ý Trường _id luôn được bao gồm theo mặc định. Bạn có thể loại trừ một cách rõ ràng _id như sau:

db.article.aggregate(
    { $project : { 
     _id : 0 , 
     title : 1 , 
     author : 1 
    }} 
); 

Từ ví dụ này, hoạt động đầu tiên trong đường ống sẽ là loại trừ _id và bao gồm các chứng từ khác.

+0

vì vậy tôi phải thêm $ dự án nhà điều hành? –

+0

thêm nó vào cuối cho một lỗi, làm thế nào để nó đặt nó [{"$ thư giãn": "$ pup"}, {"$ match": {"pup.spec.np": nomp}}, {" $ group ": {" _ id ":" $ pup.spec.id "," pup ": {" $ push ":" $ pup "}}}, {" $ project ": {" _ id ": 0}} ] ' –

+2

Nhìn vào lệnh của bạn, có vẻ như những gì bạn đang nhóm theo là null. Tôi không quen thuộc với cú pháp, nhưng nếu bạn chỉ muốn loại bỏ _id khỏi đầu ra, hãy đặt '{$ project: {_id: 0, pup: 1}}' làm op cuối cùng trên đường ống – sambomartin

2

Tôi không quen với động cơ, nhưng bạn nên có thể xóa thuộc tính trực tiếp từ kết quả.

>>> produits = {u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': 'whatever'}}]}]} 
>>> prod = produits['result'] 
>>> del prod[0]['_id'] 
>>> print prod 
[{u'pup': [{u'avt': {u'fto': 'whatever'}}]}] 
+0

cảm ơn bạn Có, tôi có thể làm điều đó bằng cách sử dụng python bằng cách sử dụng chỉ mục, nhưng nó phức tạp khi có nhiều hơn một kết quả, vì vậy tôi phải lặp lại hai lần, cho kết quả (từ điển), và cho danh sách chỉ mục BTW: motor hoạt động giống như pymongo, ngoại trừ nó sử dụng gọi lại bởi vì nó làm cho các cuộc gọi không chặn –

-1

Đây không phải là exaclty một mongoWay để làm việc đó, nhưng bạn có thể sử dụng nhà máy này để tạo ra một đối tượng mà bao gồm tất cả nhưng _id

/** 
* Factory that returns a $project object that excludes the _id property https://docs.mongodb.com/v3.0/reference/operator/aggregation/project/ 
* @params {String} variable list of properties to be included 
* @return {Object} $project object including all the properties but _id 
*/ 
function includeFactory(/* properties */){ 
    var included = { "_id": 0 }; 
    Array.prototype.slice.call(arguments).forEach(function(include){ 
     included[include] = true 
    }) 

    return { "$project": included } 
} 

Sau đó sử dụng nó như thế này:

cities.aggregate(
{ "$group": { "_id": null, "max": { "$max": "$age" }, "min": { "$min": "$age" }, "average": { "$avg": "$age" }, "total": { "$sum": "$count" } } }, 
     includeFactory('max','min','average','total') 
) 
+2

Lợi ích là tốt nhất với nhận xét giải thích lý do. Bằng cách đó, tất cả chúng ta đều có thể tìm hiểu về nó. – Danielo515

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