MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Използване на позиционния оператор $ на MongoDB в дълбоко вложена заявка за документ

Получавате грешка от

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

защото има правописна грешка ("kingdom.buildings.$" трябва да е "kingdoms .buildings.$").
Този начин обаче не може да постигне това, което очаквате.
$ винаги е насочен къмцарствата по пътя на царства.сгради - първият масив.

Това е начин, който трябва да разреши проблема.
(Необходима е V2.6+)

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

За да запазите само първия елемент от царства ,

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. Модел на съобщения в частен чат Mongoose

  2. Автоматизация и управление на бази данни с отворен код в облака - обявяване на ClusterControl 1.6

  3. BSON::ObjectId срещу Mongo::ObjectID

  4. Свързване и създаване на MongoDB присъединявания с помощта на SQL:Част 1

  5. Как да разположите бази данни с отворен код