我一直在寻找几个小时,但我找不到任何相关的东西。
情况: 后端,存在NodeJS + Express + Mongoose(+ MongoDB ofcourse)。
现在我使用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
,然后在后端将所有空值转换为未定义。
虽然仍然很难看。必须有更好的方法。
答案 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);
只要您拥有要用于替换旧文档的对象上的所有属性,您就应该很好。