为什么在 MongoDB updateOne 中使用 slice 不会从数组中删除一个项目,而只会用一个奇怪的对象替换它?
Why does using slice in MongoDB updateOne does not delete an item from an array but only replaces it with a weird object?
所以有数组 coursesFollowing
在它里面的对象是这样的,例如:
objInside = {
username:"SweetWhite"
courseTitle:"TOMATOaaaaa"
progress:0
}
我有一个函数可以在那种对象的对象数组中找到正确的对象索引
它似乎在找到的索引和对象方面有效,但是当我执行它时我的更新请求工作得很奇怪:
User.updateOne({username: req.body.username}, {coursesFollowing:{$slice: [removeIndex , 1]}}, function(err,result){
if(err){return next(err)}
})
它找到了正确的用户来放入它,也找到了正确的字段,但是它并没有删除那个 removeIndex
索引中的对象,而是删除了数组中的所有项目并只放入一个对象其中,以removeIndex
为第一个值,第二个值为1的名为$slice的数组,从数据来看它并没有删除所有其他对象,只是简单地用自己替换了它们,操作$slice推动了自己进入数组并没有执行我想?我有点困惑。
无论如何,我该如何解决这个问题?如何在不推送奇怪的 $slice 对象数组的情况下删除数组的索引?
谢谢!
如果您注意到更新的文档,您可能会意识到您实际上并没有使用 $slice
运算符更新数组中的任何内容。相反,您正在为数组设置一个新值。这就是为什么您将第一个元素视为 $slice
而将第二个元素视为 1
.
$slice
运算符与$push
一起使用,最终用于限制数组字段中的元素个数。给定索引,文档没有提到用这个删除数组元素。
根据这个 answer 没有简单的方法可以做到这一点。
有 $pull
,但它不适用于给定的索引。它基于数组中对象的查询条件工作。因此,如果您首先找出元素索引,然后在更新查询中使用它。你可以直接这样做。
如果您想使用 JS 函数,您可以使用 splice
,它会 in-place 更新。使用 $function
User.updateOne({username: req.body.username}, [{ $set:
{ "coursesFollowing": { $function: { body: function(coursesFollowing) { coursesFollowing.splice(removeIndex, 1); return coursesFollowing; }, args: ["$coursesFollowing"], lang: "js" }} }
}], function(err,result){
if(err){return next(err)}
})
所以有数组 coursesFollowing 在它里面的对象是这样的,例如:
objInside = {
username:"SweetWhite"
courseTitle:"TOMATOaaaaa"
progress:0
}
我有一个函数可以在那种对象的对象数组中找到正确的对象索引 它似乎在找到的索引和对象方面有效,但是当我执行它时我的更新请求工作得很奇怪:
User.updateOne({username: req.body.username}, {coursesFollowing:{$slice: [removeIndex , 1]}}, function(err,result){
if(err){return next(err)}
})
它找到了正确的用户来放入它,也找到了正确的字段,但是它并没有删除那个 removeIndex
索引中的对象,而是删除了数组中的所有项目并只放入一个对象其中,以removeIndex
为第一个值,第二个值为1的名为$slice的数组,从数据来看它并没有删除所有其他对象,只是简单地用自己替换了它们,操作$slice推动了自己进入数组并没有执行我想?我有点困惑。
无论如何,我该如何解决这个问题?如何在不推送奇怪的 $slice 对象数组的情况下删除数组的索引?
谢谢!
如果您注意到更新的文档,您可能会意识到您实际上并没有使用 $slice
运算符更新数组中的任何内容。相反,您正在为数组设置一个新值。这就是为什么您将第一个元素视为 $slice
而将第二个元素视为 1
.
$slice
运算符与$push
一起使用,最终用于限制数组字段中的元素个数。给定索引,文档没有提到用这个删除数组元素。
根据这个 answer 没有简单的方法可以做到这一点。
有 $pull
,但它不适用于给定的索引。它基于数组中对象的查询条件工作。因此,如果您首先找出元素索引,然后在更新查询中使用它。你可以直接这样做。
如果您想使用 JS 函数,您可以使用 splice
,它会 in-place 更新。使用 $function
User.updateOne({username: req.body.username}, [{ $set:
{ "coursesFollowing": { $function: { body: function(coursesFollowing) { coursesFollowing.splice(removeIndex, 1); return coursesFollowing; }, args: ["$coursesFollowing"], lang: "js" }} }
}], function(err,result){
if(err){return next(err)}
})