【发布时间】:2018-08-29 00:39:18
【问题描述】:
我在更新数据库时遇到问题。我有一个调查集合,每个文档如下:
{
"_id": {
"$oid": "5aaf4f7984521736d88db4bb"
},
"title": "4242 ",
"body": "4242 ",
"subject": "4242 ",
"recipients": [
{
"email": "a@gmail.com",
"responded": false,
"_id": {
"$oid": "5ab04084be3c1529bcbdcd6e"
}
},
{
"email": " b@gmail.com",
"responded": false,
"_id": {
"$oid": "5ab04084be3c1529bcbdcd6d"
}
},
{
"email": " c@gmail.com",
"responded": false,
"_id": {
"$oid": "5ab04084be3c1529bcbdcd6c"
}
},
{
"email": " d@gmail.com",
"responded": false,
"_id": {
"$oid": "5ab04084be3c1529bcbdcd6b"
}
},
{
"email": " e@gmail.com",
"responded": false,
"_id": {
"$oid": "5ab04084be3c1529bcbdcd6a"
}
}
],
"_user": {
"$oid": "5aa5edbf8887a21af8a8db4c"
},
"dateSent": {
"$date": "2018-03-20T00:11:55.943Z"
},
"yes": 0,
"no": 0,
"__v": 0
}
每当用户回复调查时,我都会使用 mongoose 在后端调用它来尝试更新我的数据库。
const Survey = mongoose.model('surveys');
Survey.updateOne(
{
_id: surveyId,
recipients: {
$elemMatch: { email: email, responded: false }
}
},
{
$inc: { [choice]: 1 },
$set: { 'recipients.$.responded': true }
}
).exec();
但只有当查询匹配收件人数组中的第一个对象时,更新才会成功。例如,这将起作用。该查询成功更新了调查文档和收件人子文档。
Survey.updateOne(
{
_id: surveyId,
recipients: {
$elemMatch: { email: "a@gmail.com", responded: false }
}
},
{
$inc: { [choice]: 1 },
$set: { 'recipients.$.responded': true }
}
).exec();
但这不起作用
Survey.updateOne(
{
_id: surveyId,
recipients: {
$elemMatch: { email: "b@gmail.com", responded: false }
}
},
{
$inc: { [choice]: 1 },
$set: { 'recipients.$.responded': true }
}
).exec();
这些是我的架构
const surveySchema = new Schema({
title: String,
body: String,
subject: String,
recipients: [RecipientSchema],
yes: { type: Number, default: 0 },
no: { type: Number, default: 0 },
_user: { type: Schema.Types.ObjectId, ref: 'User' },
dateSent: Date,
lastResponded: Date
});
const recipientSchema = new Schema({
email: String,
responded: { type: Boolean, default: false }
});
当我使用 node 尝试手动查询数据库时,它也只在查询匹配第一个收件人子文档时返回调查。
这会成功找到调查并返回。
Survey.find(
{
_id: "5aaf4f7984521736d88db4bb",
recipients: {
$elemMatch: {
email: "a@gmail.com",
responded: false
}
}
}).then(console.log)
这些没有
Survey.find(
{
_id: "5aaf4f7984521736d88db4bb",
recipients: {
$elemMatch: {
email: "b@gmail.com",
responded: false
}
}
}).then(console.log)
Survey.find(
{
_id: "5aaf4f7984521736d88db4bb",
recipients: {
$elemMatch: {
email: "c@gmail.com",
responded: false
}
}
}).then(console.log)
我一直在尝试查找 $elemMatch 的工作原理,有人告诉我,我无法查询收件人数组中对象的属性,而我只能查询其 ID。
【问题讨论】:
-
这是完整的代码吗?
-
还有很多,但我不想复制我的整个路线。我只是发布了我认为相关的内容。它看起来怎么样?我应该添加更多吗?
-
我认为您的代码没有任何问题。您可能缺少的是从字符串转换为 ObjectId 以获取调查 ID。
-
是的,我认为它也应该起作用,这就是为什么我真的不知道为什么它不起作用。
标签: javascript mongodb mongoose