我发现很难将数据分别保存到一个集合中

时间:2018-12-20 18:47:10

标签: angular mongodb

我有3个不同的页面,内容正在从一个集合中加载。内容包含ID,版本和路径。路径是对象的数组,属性“ service”之一将分隔页面的内容,例如,如果“ service”:“ page1”,则将该对象推送到Array,这将加载page1数据,依此类推。 ID和版本保持不变。

这是代码

"_id" : "admin",
    "version" : "1.0",
    "path" : [ 
        {
            "type" : "ABC",
            "number" : "1234",
            "position" : "ABC",
            "service" : "page1"
        }, 
        {
            "type" : "ABC",
            "number" : "2233",
            "position" : "ABC",
            "service" : "page3"
        }, 
        {
            "type" : "ABC",
            "number" : "12345",
            "position" : "ABC",
            "service" : "page2"
        }, 
        {
            "type" : "ABC",
            "number" : "2345",
            "position" : "ABC",
            "service" : "page3",
        }
    ]
} 

我能够加载数据,但是在保存日期时面临的问题是,如果我选择在页面1中保存,则将删除页面2和页面3的内容,只有页面1的数据可用,如果在页面2中选择保存,则第1页和第3页的内容将被删除。我需要根据“服务”的值保存数据     //保存数据

this.http.patch(URL + 'document/' + c, { "$set": { path: temp.path } }, this.hdr).toPromise().then(res => {...})

我正在使用angular 6,数据库是MongoDB。请解决此保存问题。

1 个答案:

答案 0 :(得分:0)

如果我正确理解,您将检索与某个查询匹配的path元素,这些查询位于一个数组中。 (我从您文献记载不充分的问题中假设是“ temp.path”)。

然后,您将路径更新为该数组,现在不再包含其他页面的对象。

解决方案: 您需要{$ set:{'path':fullPath}} 假设

// the entire path array as present in your collection
    fullPath =[{service: "page1", ... }, {service: "page1", ...}, {service: "page2"}...] 
    temp.path = fullPath.filter(p=>p.service==="page1");

这应该起作用,因为变量是通过引用传递的,并且数组temp.path引用了fullPath的对象。这意味着您对temp.path所做的修改将反映在fullPath

编辑:这似乎很轻巧,您可以将整个路径获取到客户端,并在进行更改时推动整个路径。  如果不是这样,它将变得更加复杂,您需要为每个更改的成员进行单独的更新操作,并使用$ expr运算符来匹配要尝试修改的路径的数组元素。