sql >> データベース >  >> NoSQL >> MongoDB

mongodbアグリゲーションでのルックアップ

    ネストされた配列があるため、 $unwindを適用する必要があります $lookupを使用する前に、埋め込まれたドキュメントを非正規化するために、最初に演算子を使用します パイプライン(集計操作で既にフラット化していない場合):

    db.personaddress.aggregate([
        { "$unwind": "$address" },
        { "$unwind": "$address.location" },
        {
            "$lookup": {
                "from": "places", 
                "localField": "address.location.place._id", 
                "foreignField": "_id", 
                "as": "address.location.place", 
            }
        }
    ])
    

    これは、(テストされていない)として実装できます:

    LookupOperation lookupOperation = LookupOperation.newLookup()
        .from("places")
        .localField("address.location.place._id")
        .foreignField("_id")
        .as("address.location.place");
    
    Aggregation agg = newAggregation(
        unwind("address"),
        unwind("address.location"),
        lookupOperation  
    );
    
    AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
        agg, PersonAddressDocument.class, OutputDocument.class
    );
    

    Spring Dataバージョンがこれをサポートしていない場合、回避策は AggregationOperationを実装することです。 DBObjectを取り込むためのインターフェース :

    public class CustomGroupOperation implements AggregationOperation {
        private DBObject operation;
    
        public CustomGroupOperation (DBObject operation) {
            this.operation = operation;
        }
    
        @Override
        public DBObject toDBObject(AggregationOperationContext context) {
            return context.getMappedObject(operation);
        }
    }
    

    次に、 $lookupを実装します 集約パイプラインでのDBObjectとしての操作:

    DBObject lookupOperation = (DBObject)new BasicDBObject(
        "$lookup", new BasicDBObject("from", "places")
            .append("localField", "address.location.place._id")
            .append("foreignField", "_id")
            .append("as", "address.location.place")       
    );
    

    これを次のように使用できます:

    Aggregation agg = newAggregation(
        unwind("address"),
        unwind("address.location"),
        lookupOperation  
    );
    
    AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
        agg, PersonAddressDocument.class, OutputDocument.class
    );
    


    1. redisのpubsubタイムアウト機能を実装するにはどうすればよいですか?

    2. JSON形式の「説明」からオンザフライでMongooseスキーマを定義する

    3. Nodejsパフォーマンスの最適化

    4. MongoDBでデータベースを作成する