2

在使用 MongoDB 时,我似乎遇到了障碍,并且想知道是否有任何方法,而无需修改我的数据库结构。现在我的数据库结构如下:

Company= 
{
   _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: 500
                 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"
                       }]                    
             }]
       }]       
}

我遇到了一个问题,我无法找到更新属性中特定 tag_id 的方法。比如我想把属性2中tag_id 4的值改为100。或者我想给tag_id 3中的通道数组添加一个通道。

我想做的是类似于这样的事情:

db.company.update({_id:1, "properties.property_id":2, "tags.tag_id":4}, {"properties.$.tags.$.tag_value":100});

但是我知道当前版本的 MongoDB 不支持这一点,它已经在 J​​IRA 中。所以我的问题是,无论如何要更新文档的值,您需要指定两个不同的条件才能访问它。我知道我可以做 properties.1.tags.0,但是我不知道我的数组的顺序,我的查询将以编程方式运行。

任何帮助都会很棒,即使是我必须重组我的桌子的构造。

谢谢

4

1 回答 1

1

展平一个数组可能会导致相当大的文档,因为对于每个内部数组元素,其外部元素的所有数据都必须重复(并且对于所有级别都是如此)。

因此,如果 flatten 不是一个选项,那么在等待提到的 Jira ( SERVER-831 ) 中的增强功能时,这里有一个解决方法:

  • 将文档读入变量
  • 操作数组
  • 更新文档,重写整个数组

鉴于您的示例,这将如下所示:

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

结果是:

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"
                        }
                    ]
                }
            ]
        }
    ]
}
于 2013-04-01T01:33:42.757 回答