MongoDB:更新嵌套数据,但避免使用多个对象

时间:2015-10-01 03:21:07

标签: javascript mongodb

我尝试将一些数据插入现有文档中:

Graph.update(
    { id: id }, 
    {
        $push: {
            tooltips: {
                element: Session.get('tooltipID'),
                text: text
            }
        }
    }
);

这样做效果很好,但是如果工具提示中已有数据,则应更新此数据而不是添加新对象,因为只有唯一元素(tooltipID)的唯一对象。

我想避免工具提示中相同元素值的这些多个条目。

{
    "_id" : "c4bKur6TKcgFHGLZZ",
    "data" : "[]",
    "tooltips" : [
        {
            "element" : "2d4edaaf",
            "text" : "Lorem"
        },
        {
            "element" : "2d4edaaf",
            "text" : "ipsum"
        }
    ]
}

但是如果元素真的是唯一的,那么应该可以在工具提示中有多个对象......

我尝试在update()中添加upsert:true,但这不起作用。

1 个答案:

答案 0 :(得分:1)

绝对upsert不适用于嵌入式文档。

一种方法可以是

Graph.update({id:id}, 
    {
       $addToSet: {
           'tooltips': {
              element: Session.get('tooltipID'),
              text: text
            }
       }
})

确保工具提示没有重复;

类似地,您可以使用$set

Graph.update({
  id:id,
 'tooltips.element': Session.get('tooltipID')
  }, 
  {
 $set: {
    'tooltips.$.text':text
   }
})

或者你可以在推之前拉

Graph.update({
    "id":id
}, {
    $pull: {
        'tooltips': {
            "element": Session.get('tooltipID')
        }
    }
})
    Graph.update(
    { id: id }, 
    {
        $push: {
            tooltips: {
                element: Session.get('tooltipID'),
                text: text
            }
        }
    }
);