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

Bản cập nhật Mongo của phụ tài liệu

Làm phẳng một mảng có thể dẫn đến các tài liệu khá lớn, vì đối với mỗi phần tử mảng bên trong, tất cả dữ liệu của phần tử bên ngoài của nó phải được lặp lại (và điều này cho tất cả các cấp).

Vì vậy, nếu làm phẳng không phải là một tùy chọn, đây là một giải pháp trong khi chờ đợi chức năng nâng cao trong Jira đã đề cập ( MÁY CHỦ-831 ):

  • đọc tài liệu thành một biến
  • thao tác với mảng
  • cập nhật tài liệu, viết lại toàn bộ mảng

Với ví dụ của bạn, nó sẽ giống như sau:

doc = db.xx.findOne( {_id:1} );
doc.properties.forEach( function(p) {
    if ( p.property_id == 2 ) { 
        p.tags.forEach( function(t) {
           if ( t.tag_id == 3 ) {
               t.tag_value = 100;
           }
           else if ( t.tag_id == 4 ) {
               newChannel = {};
               newChannel.channel_id = 5;
               newChannel.channel_name = "test5";
               t.channels.push(newChannel);
           }
        })
    }
});
db.xx.update({_id:1},{$set:{properties:doc.properties}});

Kết quả là:

doc = db.xx.findOne({_id:1})
{
    "_id" : 1,
    "properties" : [
        {
            "property_id" : 1,
            "tags" : [
                {
                    "tag_id" : 1,
                    "tag_value" : 1000,
                    "channels" : [
                        {
                            "channel_id" : 1,
                            "channel_name" : "test1"
                        },
                        {
                            "channel_id" : 2,
                            "channel_name" : "test2"
                        }
                    ]
                },
                {
                    "tag_id" : 2,
                    "tag_value" : 2500,
                    "channels" : [
                        {
                            "channel_id" : 2,
                            "channel_name" : "test2"
                        },
                        {
                            "channel_id" : 3,
                            "channel_name" : "test3"
                        }
                    ]
                }
            ]
        },
        {
            "property_id" : 2,
            "tags" : [
                {
                    "tag_id" : 3,
                    "tag_value" : 100,
                    "channels" : [
                        {
                            "channel_id" : 1,
                            "channel_name" : "test1"
                        },
                        {
                            "channel_id" : 3,
                            "channel_name" : "test3"
                        }
                    ]
                },
                {
                    "tag_id" : 4,
                    "tag_value" : 5000,
                    "channels" : [
                        {
                            "channel_id" : 1,
                            "channel_name" : "test1"
                        },
                        {
                            "channel_id" : 5,
                            "channel_name" : "test5"
                        }
                    ]
                }
            ]
        }
    ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose:không chèn nếu phần tử đã được lưu trữ

  2. Ionic2 + Meteor:nhận _id của vật phẩm mới được chèn

  3. Chèn dữ liệu vào mảng lồng nhau trong mongodb

  4. mongoengine - Truy vấn trên ListField của EmbeddedDocumentField

  5. Làm thế nào để cập nhật cơ sở dữ liệu MongoDb trong Java?