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

Truy vấn dữ liệu bản địa hóa trong MongoDB

Để tạo một truy vấn chung, người ta sẽ cần khung tổng hợp vì nó có một số toán tử hữu ích để giúp bạn thực hiện việc này. Để bắt đầu, bạn sẽ cần chuyển đổi tài liệu nhúng thành mảng các cặp khóa / giá trị và sau đó lọc mảng trên trường khóa chuyển trong ngôn ngữ dưới dạng tham số.

Ví dụ:chuyển đổi tài liệu

  "title": {
    "en": "title en2",
    "de": "title de2"
  },

vào một mảng

  "title": [
    { "k": "en", '"v": "title en2" },
    { "k": "de", "v": "title de2" }
  ],

sử dụng $objectToArray nhà điều hành. Sau đó, bạn có thể lọc mảng này trên trường khóa bằng cách sử dụng $filter nhà điều hành với tư cách là

{
    '$filter': {
        'input': { '$objectToArray': '$title' },
        'cond': { '$eq': ['$$this.k', locale] }
    }
}

trong đó ngôn ngữ biến được bắt nguồn từ tham số được truyền vào.

Sau khi bạn có mảng được lọc, việc nhận trường giá trị yêu cầu $arrayElemAt toán tử được áp dụng trên khóa giá trị là

{ 
    '$arrayElemAt': ['$title.v', 0]
}

Vì vậy, cuối cùng bạn sẽ phải chạy một đường dẫn như thế này:

var locale = 'en';

db.cs.aggregate([
    { '$match': { "cID" : "00001" } },
    { '$addFields': {
        'title': {
            '$filter': {
                'input': { '$objectToArray': '$title' },
                'cond': { '$eq': ['$$this.k', locale] }
            }
        },
        'desc': {
            '$filter': {
                'input': { '$objectToArray': '$desc' },
                'cond': { '$eq': ['$$this.k', locale] }
            }
        }
    } },

    { '$addFields': {
        'title': { 
            '$arrayElemAt': ['$title.v', 0]
        },
        'desc': { 
            '$arrayElemAt': ['$desc.v', 0]
        }
    } }
]);

Và với một số cấu trúc lại:

var locale = 'en';
var getFilterOperatorExpression = function (field) {
    return {
        '$filter': {
            'input': { '$objectToArray': '$'+ field },
            'cond': { '$eq': ['$$this.k', locale] }
        }
    }
};
var getValueOperatorExpression = function (field) { 
    return { 
        '$arrayElemAt': ['$'+ field +'.v', 0]
    }
};

db.cs.aggregate([
    { '$match': { "cID" : "00001" } },
    { '$addFields': {
        'title': getFilterOperatorExpression('title'),
        'desc': getFilterOperatorExpression('desc'),
    } },

    { '$addFields': {
        'title': getValueOperatorExpression('title'),
        'desc': getValueOperatorExpression('desc')
    } }
]);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Đối sánh Elem đang trả lại tất cả dữ liệu trong khi tôi chỉ cần dữ liệu đã chọn

  2. Làm cách nào để kết nối Django Rest-api với MongoDB?

  3. Kiểm tra trường tồn tại bằng MongoDB

  4. Mongodb tìm bên trong mảng phụ

  5. toán tử pushOrModify like cho mongo subocument