错误'无法将$ pull应用于非数组值'

时间:2017-06-03 10:58:00

标签: node.js mongodb mongodb-query

db.collection(USERDETAILS_COLLECTION).findOneAndUpdate(
                                { "emailVerificationHistory.verifyCode":mailCode },
                                {'$pull':{"emailVerificationHistory.$.verifyCode":mailCode}},
                                function(err,pullData) {
                                    if(err) {
                                        console.log(err);
                                    } else {
                                        res.send({msg: 'User Verified Succesfully', status: 1});
                                    }
                                });

当我执行上面的代码时,我收到以下错误。

name: 'MongoError',
  message: 'Cannot apply $pull to a non-array value',
  ok: 0,
  errmsg: 'Cannot apply $pull to a non-array value',
  code: 16837,

下面是我的MongoDB对象。

{
    "_id" : ObjectId("593270b8bc98ea235cfaf68f"),
    "username" : "parengalhisham@gmail.com",
    "roleId" : 3,
    "userId" : ObjectId("593270b8bc98ea235cfaf68e"),
    "profile" : {
        "firstName" : "Hisham",
        "lastName" : "Mubarak"
    },
    "activeFlag" : 1,
    "authType" : [ 
        "facebook"
    ],
    "emailVerified" : false,
    "emailVerificationHistory" : [ 
        {
            "email" : "parengalhisham@gmail.com",
            "verifyCode" : "59327155480b791b7845dfd7",
            "requestDate" : ISODate("2017-06-03T08:20:37.156Z"),
            "verifiedDate" : ISODate("2017-06-03T10:31:53.720Z")
        }
    ]
}

如何使用verifyCode搜索emailVerificationHistory数组并仅从数组中的第一个对象中删除verifyCode?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您对$pull的使用不正确:

db.collection(USERDETAILS_COLLECTION).findOneAndUpdate(
  { "emailVerificationHistory.verifyCode":mailCode },
  {'$pull':{ "emailVerificationHistory": { "verifyCode": mailCode } },
  function(err,pullData) {
      if(err) {
          console.log(err);
      } else {
          res.send({msg: 'User Verified Succesfully', status: 1});
      }
  }
);

$pull更新运算符本身就像一个查询。因此它需要一个条件并从数组中“拉出”匹配元素。

因此,尽管使用选择查询来匹配数组中的元素是一个好习惯,但是不要对元素使用位置$运算符,而是提供数组本身。