MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Sử dụng toán tử vị trí của MongoDB $ trong một truy vấn tài liệu được lồng sâu

Bạn gặp lỗi từ

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

vì có lỗi chính tả ("Kingdom.buildings. $" phải là "Kingdom s .buildings. $ ").
Tuy nhiên, cách này không thể đạt được những gì bạn mong đợi.
$ luôn nhắm đến vương quốc trong con đường của vương quốc.buildings - mảng đầu tiên.

Đây là cách có thể giải quyết vấn đề.
(yêu cầu 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();

Để chỉ dành phần tử đầu tiên của vương quốc ,

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. Bắt đầu với MongoDB Go Driver

  2. mongoose 'findById' trả về null với id hợp lệ

  3. Tổng hợp Pymongo - chuyển danh sách python để tổng hợp

  4. Làm cách nào để tránh cảnh báo transparent_hugepage / defrag từ mongodb?

  5. Tải dữ liệu ban đầu khi khởi động ứng dụng với Spring Data MongoDB