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

Menggunakan operator posisi MongoDB $ dalam kueri dokumen yang sangat bersarang

Anda mendapatkan kesalahan dari

db.users.findOne(
    { username: 'test', 'kingdoms.buildings.type': 'castle' },
    { kingdoms: {$slice: [n, 1]}, 'kingdom.buildings.$': 1 }
);

karena ada kesalahan ejaan ("kingdom.buildings.$" seharusnya "kingdoms .buildings.$").
Namun, cara ini tidak dapat memenuhi apa yang Anda harapkan.
$ selalu ditujukan ke kerajaan di jalur kingdoms.buildings - susunan pertama.

Ini adalah cara yang seharusnya bisa memecahkan masalah.
(V2.6+ diperlukan)

db.c.aggregate([ {
    $match : {
        username : 'test',
        'kingdoms.buildings.type' : 'castle'
    }
}, {
    $project : {
        _id : 0,
        kingdoms : 1
    }
}, {
    $redact : {
        $cond : {
            "if" : {
                $or : [ {
                    $gt : [ "$kingdoms", [] ]
                }, {
                    $gt : [ "$buildings", [] ]
                }, {
                    $eq : [ "$type", "castle" ]
                } ]
            },
            "then" : "$$DESCEND",
            "else" : "$$PRUNE"
        }
    }
} ]).pretty();

Untuk hanya memesan elemen pertama kerajaan ,

db.c.aggregate([ {
    $match : {
        username : 'test',
        'kingdoms.buildings.type' : 'castle'
    }
}, {
    $redact : {
        $cond : {
            "if" : {
                $or : [ {
                    $gt : [ "$kingdoms", [] ]
                }, {
                    $gt : [ "$buildings", [] ]
                }, {
                    $eq : [ "$type", "castle" ]
                } ]
            },
            "then" : "$$DESCEND",
            "else" : "$$PRUNE"
        }
    }
}, {
    $unwind : "$kingdoms"
}, {
    $group : {
        _id : "$_id",
        kingdom : {
            $first : "$kingdoms"
        }
    }
}, {
    $group : {
        _id : "$_id",
        kingdoms : {
            $push : "$kingdom"
        }
    }
}, {
    $project : {
        _id : 0,
        kingdoms : 1
    }
} ]).pretty();



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menemukan banyak kata dengan find() di MongoDB

  2. Agregat dengan jumlah sub dokumen yang sesuai dengan kondisi dan pengelompokannya

  3. Bagaimana cara membuat dump MongoDB dari database saya?

  4. Mongoose - Pembaruan yang efisien pada array yang diindeks dari luwak.Schema.Types.Mixed

  5. Apakah ada solusi untuk mengizinkan penggunaan regex di pipa agregasi Mongodb