MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

cari di agregasi mongodb

Karena Anda memiliki array bersarang, Anda perlu menerapkan $unwind operator terlebih dahulu untuk mendenormalisasi dokumen yang disematkan sebelum menggunakan $lookup pipeline (kecuali Anda telah meratakannya dalam operasi agregasi):

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

yang kemudian dapat diimplementasikan sebagai (belum diuji):

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

Jika versi Data Musim Semi Anda tidak mendukung ini, solusinya adalah dengan menerapkan AggregationOperation antarmuka untuk menerima 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);
    }
}

Kemudian terapkan $lookup operasi sebagai objek DBO dalam pipa agregasi:

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

yang kemudian dapat Anda gunakan sebagai:

Aggregation agg = newAggregation(
    unwind("address"),
    unwind("address.location"),
    lookupOperation  
);

AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
    agg, PersonAddressDocument.class, OutputDocument.class
);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose/node.js cara menemukan, mengisi, melakukan sesuatu, 'mengurangi populasi', dan memperbarui

  2. ClusterControl - Semua Sorotan &Peningkatan Fitur Dari 2017

  3. Cara Menggunakan Pengumpulan Koneksi MongoDB di AWS Lambda

  4. MongoError:Opsi 'kursor' diperlukan, kecuali untuk agregat dengan argumen penjelasan

  5. Luwak menambahkan beberapa objek ke array jika tidak ada berdasarkan