MongoDB更新对象并删除属性?

时间:2016-05-03 15:05:13

标签: node.js mongodb mongoose

我一直在寻找几个小时,但我找不到任何相关的东西。

情况: 后端,存在NodeJS + Express + Mongoose(+ MongoDB ofcourse)。

  1. 前端从后端检索对象。
  2. 前端进行一些更改(添加/更新/删除一些属性)。
  3. 现在我使用mongoose:PersonModel.findByIdAndUpdate(id,updatedPersonObject);

    结果:添加了添加的属性。更新的属性已更新。删除的属性......仍在那里!

    现在我一直在寻找一种优雅的方法来解决这个问题,但我能想到的最好的方法是:

    datacontex.Table.Where(e => e.id == id).OrderByDescending(e => e.<item>).FirstOrDefault();
    

    (我甚至没有提供简单的代码来获取旧文档)。

    我必须为每个要更新的对象编写这个。我发现很难相信这是解决这个问题的最佳方法。有人建议吗?

    编辑: 我找到的另一个解决方法是:要在MongoDB中取消设置值,必须将其设置为undefined。 如果我在前端设置此值,它将在REST调用中丢失。所以我在前端将它设置为ID ITEM2 ITEM1 1 1 <auto generated timestamp> 1 2 1 3 [...] [...] 1 5000 2 3000 2 3001 2 3002 [...] [...] 2 8000 100 1001 100 1002 100 1003 [...] [...] 100 6000 ,然后在后端将所有空值转换为未定义。

    虽然仍然很难看。必须有更好的方法。

1 个答案:

答案 0 :(得分:0)

如果您想知道有多少文档符合您的过滤条件以及更改了多少文档,可以使用replaceOne()(我相信它只会更改一个文档,因此了解该信息可能没有用)。文件:https://mongoosejs.com/docs/api/model.html#model_Model.replaceOne

或者,如果您想查看文档,则可以使用findOneAndReplace。我不知道是传递给回调的是旧文档还是新文档。文档说Finds a matching document, replaces it with the provided doc, and passes the returned doc to the callback.,但您可以自己进行测试。文件:https://mongoosejs.com/docs/api.html#model_Model.findOneAndReplace 因此,代替:

PersonModel.findByIdAndUpdate(id, updatedPersonObject);,您可以这样做:

PersonModel.replaceOne({ _id: id }, updatedPersonObject);

只要您拥有要用于替换旧文档的对象上的所有属性,您就应该很好。