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?感谢您的帮助。
答案 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
更新运算符本身就像一个查询。因此它需要一个条件并从数组中“拉出”匹配元素。
因此,尽管使用选择查询来匹配数组中的元素是一个好习惯,但是不要对元素使用位置$
运算符,而是提供数组本身。