programing

종합적으로 단일 결과를 얻는 것이 가능합니까?

linuxpc 2023. 5. 16. 22:13
반응형

종합적으로 단일 결과를 얻는 것이 가능합니까?

다음에 대한 단일 문서를 얻을 수 있습니까?db.collection.aggregate마찬가지로db.collection.findOne?

네, 가능합니다.다음과 같은 단계를 추가합니다._id와 동등한.null이렇게 하면 모든 입력 문서에 대해 누적된 값이 계산됩니다.예.

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

또는 집계된 결과에서 하나의 문서만 가져오려면 다음을 사용할 수 있습니다.

{ $limit: 1 }

업데이트: 두 솔루션 모두 문서가 하나 있는 커서를 반환합니다.하지만 생각하지 마findOne특별한 것으로서또한 커서를 검색하여 첫 번째 문서(있는 경우)만 가져옵니다.다음은 mongo 셸 구현입니다.findOne:

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;
}

보다시피 내부적으로 다음을 사용합니다.find그래서, 만약 당신이 단일 문서로 커서 대신 단일 문서를 얻고 싶다면, 당신은 당신 자신의 함수를 쓸 수 있습니다. 그것은 같은 것입니다.aggregate.예.

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

용도:

> db.collection.aggregateOne(...)

집계 파이프라인에 단계를 추가할 수 있습니다.그러나 하나의 문서와 일치하더라도 결과는 여전히 목록(이 경우 길이 1)이 됩니다.그래서 답은 "아니오, 그것은 불가능합니다"입니다.

네, 가능합니다.mongodb $match 작업을 사용해야 합니다.

ex: 이것은 나를 위해 작동합니다.

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

mondodb 문서의 예:

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

만약 "단일의 결과로"를 의미한다면,findOne스타일 리턴 유형, 그렇게 하는 것은 불가능해야 합니다.그것이 불가능하다고 말하지는 않지만, 그렇게 취급되어야 하고 그렇게 취급되어야 합니다.집계 작업은 집계 커서만 반환하도록 문서화되므로 집계 작업에 대한 유일한 강력한 결론은 다음 중 하나입니다.aggregate cursor또는error집계 커서를 받으면 노출된 방법을 사용하여 단일 문서에 액세스할 수 있습니다.다른 것을 기대하는 것은 혼란을 부추기는 것과 같습니다.

Ps: 이 스레드에 엄청나게 늦게 도착했습니다. 나중에 여기에 오게 될 수도 있는 다른 사람들을 돕기를 바랍니다.

Python에서는 결과를 목록으로 변환하여 첫 번째 요소를 얻을 수 있습니다.

result = list(mongo.db.collection.aggregate([{"$sample": {"size": 1}}]))[0]

다른 간단한 해결책으로 답을 개선하고 반복되는 코드를 많이 작성하지 않기 위해 @Sergey Berezovsky 답변을 기반으로 한 저의 해결책입니다.

import { Collection } from 'mongodb';

Collection.prototype.aggregateOne = async function(pipeline, options) {
   const items = await this.aggregate(pipeline, options).toArray();
   return items.length > 0 ? items[0] : null; 
}

일반 Aggregate 기능과 마찬가지로 다음과 같이 사용할 수 있습니다.

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

그러면 첫 번째 문서가 존재하거나 null인 경우 반환됩니다.

이것이 누군가의 삶에 도움이 되기를 바랍니다 rrs.

제가 실제로 이 일을 하러 가는 방법은collection.aggregate(pipeline).next()

그게 바로 내가 원했던 거였어요

언급URL : https://stackoverflow.com/questions/26375301/is-it-possible-to-get-single-result-in-aggregate

반응형