2014-10-15 17 views
9

o db.collection.findOne gibi gibi db.collection.aggregate tek bir belge almak mümkün mü?Tek bir sonucu toplu olarak almak mümkün mü?

+1

burada bulman için ne soruyorsun gerçekten net değil. Özellikle ne yapmak istediğinizi açıklamalısınız. BTW şu ana kadar verilen cevap çoğu vaka için yanlıştır. –

cevap

2

boru hattının kümelenmeye karşı $match sahne eklemek mümkündür. Ancak, yalnızca tek bir belgeyle eşleşecek olsa bile, sonuç yine de bir liste olacaktır (bu durumda bir uzunluğun uzunluğu). Yani cevap "mümkün değildir, HAYIR" dir.

12

Evet, bu mümkün. Sadece null eşit _id ile $group sahne ekleyin. Bu, tüm girdi belgeleri için bir bütün olarak birikmiş değerleri hesaplar. Örneğin.

{ $group: { _id: null, total: { $sum: "$price" }}} 

Yoksa toplu sonuçlarından yalnızca bir belgeyi almak istiyorsanız, kullanabileceğiniz $limit:

{ $limit: 1 } 

GÜNCELLEME: Her iki çözüm tek bir belge olurdu imleci döndürür. Ama özel bir şey olarak findOne hakkında düşünmeyin. Ayrıca imleci alır ve sadece ilk belgeyi alır (varsa). Gördüğünüz gibi

function (query , fields, options){ 
    var cursor = this.find(query, fields, -1 /* limit */, 0 /* skip*/, 
     0 /* batchSize */, options); 

    if (! cursor.hasNext()) 
     return null; 
    var ret = cursor.next(); 
    if (cursor.hasNext()) throw "findOne has more than 1 result!"; 
    if (ret.$err) 
     throw "error " + tojson(ret); 
    return ret; 
} 

, dahili olarak find kullanır: İşte findOne ait Mongo kabuk uygulamasıdır. Eğer tek bir belge yerine tek belge ile imleci almak istiyorsanız Yani, aggregate aynı işi kendi işlevini yazabilirsiniz. Örneğin.

> DBCollection.prototype.aggregateOne = function(pipeline) { 
    var cur = this.aggregate(pipeline); 
    if (!cur.hasNext()) 
     return null; 
    return cur.next(); 
} 

Kullanımı:

> db.collection.aggregateOne(...) 
+1

Maalesef hala çok güzel açıklanmış bir eleman – Erik

+0

Bullseye (y) ile bir dizi olsun. –

0

evet bu mümkün. mongodb $match işletimini

ex: kullanmanız gerekiyor.

{ $lookup: { from: 'user', localField: 'userId', foreignField: 'id', as: 'publisherDetails' } }, 
{ $match: { id } } 

mondodb doc's örnek:

db.articles.aggregate(
[ { $match : { id : "132ada123aweae1321awew12" } }, 
    { $lookup: { from: 'user', localField: 'userId', foreignField: 'id', as: 'publisherDetails' } } ] 
); 
İlgili konular