如何在MongoDB的嵌套文档中插入文档或字段

6

我希望创建一个名为“系统”的集合,在该集合下有一个名为“子系统”的文档,而在“子系统”文档下有三个文档,分别命名为高、中和低。每个高、中和低级别的文档都包含多个单独的文档,如下所示:

systems: {
           sub_system_1 : {
                            high :{ {task1},
                                    {task2},
                                    .......
                                  },                                
                            mid  :{ {task1},
                                    {task2},
                                    .......
                                  },
                            low :{ {task1},
                                    {task2},
                                    .......
                                  },
                          },
           sub_system_2 : {
                            high :{ {task1},
                                    {task2},
                                    .......
                                  },                                
                            mid  :{ {task1},
                                    {task2},
                                    .......
                                  },
                            low :{ {task1},
                                    {task2},
                                    .......
                                  },
                          },
           ............
         }

以下是我遇到的问题: 1. 如何创建这样的嵌套文档。 2. 如何在系统集合中插入新的子系统。 3. 如何在子系统文档下插入新的优先级(高、中、低)。 4. 如何在特定的子系统和特定的优先级(高、低、中)文档下插入新任务。
我想了解如何使用mongo shell和perl mongodb实现。
1个回答

9

使用Shell

1.如何创建嵌套文档

db.systems.insert( [{"name": "sub_system_1", "data" : {"high" :["task1","task2"], "mid": ["task1","task2"], "low" : ["task1","task2"]}},{"name": "sub_system_2" ,"data": {"high" :["task1","task2"], "mid": ["task1","task2"], "low" : ["task1","task2"]}}])

2.如何在系统集合中添加新的子系统

db.systems.insert( {"name": "sub_system_3", "data" : {"high" :["task1","task2"], "mid": ["task1","task2"], "low" : ["task1","task2"]}})

3.如何在子系统文档下插入新的优先级(高,中,低)?

// First you need to find the document using the name field
var sub_system_1 = db.systems.findOne({"name":"sub_system_1"})
// set your new priority
sub_system_1.data.new_priority = [ "task1", "task2" ]
// Save updated document 
db.systems.save(sub_system_1)

您也可以使用updateOne调用在一个语句中完成更新,请参见下面的文档 https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/#db.collection.updateOne

4.如何将新任务插入特定子系统和特定优先级(高、低、中)文档中

// First you need to find the document using the name field
var sub_system_1 = db.systems.findOne({"name":"sub_system_1"})
// Now we add a new task to priority low
sub_system_1.data.low[sub_system_1.data.low.length] = "task3"
// Save updated document 
db.systems.save(sub_system_1)

使用Perl操作MongoDB

#!/usr/bin/perl

use MongoDB::Connection;

my $mongodb_dbhost = 'mongodb.co.za';
my $mongodb_dbname = 'systems_production';
my $mongodb_dbtable = 'systems';

my $connection   =  MongoDB::Connection->new(host => $mongodb_dbhost);

my $collection = $connection->$mongodb_dbname->$mongodb_dbtable;

1. 我该如何创建这样的嵌套文档?

my $data = $collection->insert( [
    {
       "name": "sub_system_1", "data" : {"high" :["task1","task2"], "mid":     ["task1","task2"], "low" : ["task1","task2"]}
},
{
    "name": "sub_system_2" ,"data": {"high" :["task1","task2"], "mid":    ["task1","task2"], "low" : ["task1","task2"]}
}
  ]); 

2. 我如何向系统集合中插入新的子系统?

  $data = $collection->insert({
      "name": "sub_system_3", 
   "data" : {"high" :["task1","task2"], "mid": ["task1","task2"], "low" :     ["task1","task2"]}
  });

3. 我该如何在子系统文档中添加新的优先级(高、中、低)?

my $sub_system_1 = $connection->$mongodb_dbname->$mongodb_dbtable->find_one({'name' => 'sub_system_1'});
$sub_system_1->{data}->{new_priority} = [ "task1", "task2" ];
$collection->save($sub_system_1);

4. 如何在特定子系统和特定优先级(高、低、中)文档下插入新任务

你可以按照以下步骤在特定的子系统和优先级文档中插入新任务: 1. 打开相应的子系统和优先级文档。 2. 在文档中找到适当的位置来添加新任务。 3. 在该位置插入HTML标签以创建任务条目,并填写任务详细信息,例如标题、描述和截止日期。 4. 保存文档。新任务现在已经成功地添加到特定子系统和优先级文档中。
my $sub_system_1 = $connection->$mongodb_dbname->$mongodb_dbtable->find_one({'name' => 'sub_system_1'});
 $sub_system_1->{data}->{low}->[scalar(@$sub_system_1->{data}->{low})] = "task3";
 $collection->save($sub_system_1);

1
你在高、中和低三个位置创建了一个数组,而不是一个文档,这完全与我要求的相反。 - user7064075
你好,看了你的例子后发现你不能有一个没有键的任务哈希列表,任务需要成为你想要分配的任何值的键,例如 db.systems.insert( {"name": "sub_system_3", "data" : {"high" :{"task1": "some value","task2": "some other value"}, "mid": {"task1": "some value","task2": "some other value"}, "low" : {"task1": "some value","task2": "some other value"}}}) - djtsheps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接