updateMany和elem与猫鼬(Node.js)中的嵌套模式匹配

时间:2019-09-17 22:22:31

标签: node.js mongodb mongoose

我正在尝试通过猫鼬查询MongoDB数据库来更新数据库的许多字段。我想第一个请求是正确的,因为猫鼬不会触发任何错误,但是对于嵌套模式,我得到了以下错误。

我的目标是删除出现在好友中的userTag并删除当userTarget等于userTag时出现的friendRequestsSent,当userRequest等于userTag时接收的friendRequests和当数据等于userTag时的通知。

以下是我的模型的模式

const updateResponse = await User.updateMany(
        {
          friends: { $elemMatch: { $eq: userTag } },
          friendRequestsSent: {
            userTarget: {
              $elemMatch: { $eq: userTag },
            },
          },
          friendRequestsReceived: {
            userRequest: {
              $elemMatch: { $eq: userTag },
            },
          },
          notifications: {
            data: {
              $elemMatch: { $eq: userTag },
            },
          },
        },
        {
          $pull: {
            friends: userTag,
            friendRequestsSent: { userTarget: userTag },
            friendRequestsReceived: { userRequest: userTag },
            notifications: { data: userTag },
          },
        }
      )

请求

Error while deleting the user account: Cast to String failed for value "{ '$elemMatch': { '$eq': '0eQzaAwpt' } }" at path "userRequest" for model "User"

错误

{{1}}

1 个答案:

答案 0 :(得分:0)

userRequest中的friendRequestsReceived字段类型为String,而不是数组,因此$elemMatch将不起作用。另外,您无需使用$elemMatch,因为您只需在$elemMatch表达式中指定一个条件即可,如docs所示:

  

如果在$ elemMatch表达式中仅指定一个条件,则无需使用$ elemMatch。

就您而言,您只需要执行以下操作(详细信息here):

await User.updateMany({
  friends: userTag,
  "friendRequestsSent.userTarget" : userTag,
  "friendRequestsReceived.userRequest": userTag,
  "notifications.data": userTag
}...