我具有以下Mongoose函数,正在尝试 在email
= req.body.email
和referenceId
进行选择的情况下不是在一个数组中。
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已在数组中,则不要进行其他操作。
答案 0 :(得分:2)
$ push 只会将数据推送到数组中,您应该使用 $ addToSet
$ addToSet 仅确保没有重复项添加到集合中,并且不影响现有重复项。 $ addToSet不保证修改后的集合中的元素具有特定顺序
Referee.findOneAndUpdate({
email: req.body.email,
referenceId: {
'$ne': [new mongo.ObjectID(req.params.referenceId)]
}
}, {
$addToSet: {
referenceId: new mongo.ObjectID(req.body.referenceId)
}
}, {
new: true
}, (err, doc) => {
if (err) {
res.status(401).send(err);
}
res.send(doc);
});
您可以使用$elemMatch
或$nin
作为查找查询,因此,如果 id 位于 referenceId < / p>
$ elemMatch:
referenceId: {
'$elemMatch': { '$ne': new mongo.ObjectID(req.params.referenceId) }
}
$ nin:
referenceId: {
'$nin': [new mongo.ObjectID(req.params.referenceId)]
}
答案 1 :(得分:1)
请考虑使用$elemMatch运算符补充$ne
。在这种情况下,针对数组本身的$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