如果文档存在,请更新MongoDB数组,否则添加文档

时间:2018-06-21 14:05:01

标签: mongodb

完全确定答案已经存在,但是我找不到适合我的答案。

我有一些数据需要存储在mongo数据库中,该数据分布在几个文件中,这些文件被一张一张地加载,文件内容如下所示(简化):

文件1:

ID   Product.Code   Description.Title
ID1  Code1          some text
ID2  Code2          some other text

文件2:

ID   Product.Code   Description.Title
ID1  Code25         some text
ID2  Code2          some other text
ID3  Code3          yet some other text

以此类推

在循环并添加所有文件后,我想要得到的最终结果如下:

/* first record */
{
"_id" : "ID1",
"Product" : {
    "Code" : [ 
        "Code1","Code25"
    ]
},
"Description" : {
    "Title" : "some text",
}
}
/* second record */
{
"_id" : "ID2",
"Product" : {
    "Code" : [ 
        "Code2"
    ]
},
"Description" : {
    "Title" : "some other text",
}
}
/* last record */
{
"_id" : "ID3",
"Product" : {
    "Code" : [ 
        "Code3"
    ]
},
"Description" : {
    "Title" : "yet some other text",
}
}

因此逻辑如下:

从文件1开始,

-> ID1尚不存在,因此添加。

->与ID2相同

下一步添加文件2,

-> ID1已经存在,但是Product.Code尚不存在,因此将其添加到数组中并保持所有其他内容不变。

-> ID2也存在,但是Product.Code已经在数组中,所以什么也不做。

-> ID3是新的,因此请插入完整的文档数据。

以此类推,直到最后一个文件。

此刻,我预载了所有文件并连接了Product.Codes,以便可以使用update / upsert逻辑将一个文件发送到mongo。到现在为止都可以正常工作,但是由于我拥有大量可用文件,因此对于我的系统而言,它变得越来越繁重,因此,我尝试通过一些“如果新的话,否则添加新的键,如果还不存在,则将键添加到数组”来更改此设置。 / p>

我尝试/失败了$ push(不好,因为它不断不断地添加相同的键),$ addtoset等,但是没有运气。

最大的问题是,我需要在具有所有基本mongo逻辑但没有足够空间容纳高级逻辑的客户端上运行它。理想情况下,尽管我也可以使用try / error选项,但整个流程应该适合单个更新语句。

关于如何最好地解决这一问题的任何建议?

请注意,除了单个ID外,实际数据还包含许多其他属性和复杂性,因此我目前的高查询查询已经相当长了

0 个答案:

没有答案