Node.js 值不在数组中时Mongoose findOneAndUpdate
我有下面的Mongoose函数,我试图在其中选择Node.js 值不在数组中时Mongoose findOneAndUpdate,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有下面的Mongoose函数,我试图在其中选择电子邮件=请求正文。电子邮件和引用ID不在数组中 referenceId是一个字符串数组[string],它有一个对象ID数组 const refereeSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: {
电子邮件
=请求正文。电子邮件
和引用ID
不在数组中
referenceId
是一个字符串数组[string]
,它有一个对象ID数组
const refereeSchema = new Schema({
firstName: {
type: String,
required: true
},
lastName: {
type: String,
required: true
},
email: {
type: String,
required: true,
unique: true
},
referenceId: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
}
],
token: {
type: String,
required: true
},
password: {
type: String
},
company: {
type: String,
required: true
},
role: {
type: String,
required: false
},
startedOn: Date,
endedOn: Date,
createdAt: Date,
updatedAt: Date
});
Referee.findOneAndUpdate({
email: req.body.email,
referenceId: {
'$ne': [new mongo.ObjectID(req.params.referenceId)]
}
}, {
$push: {
referenceId: new mongo.ObjectID(req.body.referenceId)
}
}, {
new: true
}, (err, doc) => {
if (err) {
res.status(401).send(err);
}
res.send(doc);
});
每次运行上面的命令时,它总是匹配并推送ObjectId,即使它以前已经存在
{ referenceId:
[ 5ba94232b492890982e7a417,
5ba94232b492890982e7a417,
5c20d8f907a55accd720c27f,
5c20d8f907a55accd720c27f,
5c20d8f907a55accd720c27f,
5c20d8f907a55accd720c27f,
5c20d8f907a55accd720c27f,
5c20d8f907a55accd720c27f ],
_id: 5c20e86d72d5c1ce20b961fa,
firstName: 'Richard',
lastName: 'Hendricks',
email: 'hello@domain.com',
token: '319d9f5a-68e1-6f47-a9f1-7fbbf617a45c',
company: 'Pied Piper',
role: '',
__v: 0 }
谁能帮帮我吗
我想检查ObjectId是否已经在数组中,然后不做任何其他操作来推送它。考虑在$ne
的补码中使用运算符<在这种情况下,数组本身的code>$ne将始终返回true,因为传入参数的数组永远不会等于文档中的数组
我还没有对此进行测试,但按照这些思路应该可以做到:
Referee.findOneAndUpdate({
email: req.body.email,
referenceId: {
'$elemMatch': { '$ne': new mongo.ObjectID(req.params.referenceId) }
}
}, {
$push: {
referenceId: new mongo.ObjectID(req.body.referenceId)
}
}, {
new: true
}, (err, doc) => {
if (err) {
res.status(401).send(err);
}
res.send(doc);
});
另外,您可能已经知道这一点,但实际上您可能要导入两个ObjectId类,其中一个是
mongoose.Types.ObjectId
$push将只在数组中推送数据,您应该使用$addToSet
$addToSet仅确保不会向集合中添加重复项,并且不会影响现有重复元素$addToSet不保证修改集合中元素的特定顺序
更重要的是,您可以使用$elemMatch
或$nin
作为查找查询,这样,如果id位于referenceId中,文档本身就不会返回
$elemMatch:
referenceId: {
'$elemMatch': { '$ne': new mongo.ObjectID(req.params.referenceId) }
}
$nin:
referenceId: {
'$nin': [new mongo.ObjectID(req.params.referenceId)]
}
referenceId: {
'$nin': [new mongo.ObjectID(req.params.referenceId)]
}