[英]Mongo query search updateOne $elemmatch
我在更新數據庫時遇到問題。 我有一個調查收集,每個文檔如下:
{
"_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 }
});
當我使用節點嘗試手動查詢數據庫時,它也僅在查詢與第一個收件人子文檔匹配時才返回調查。
這將成功找到調查並返回調查。
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。
問題是您在存儲后續電子郵件時沒有對它們進行修剪,因為您會看到只有第一封電子郵件已被正確修剪,而其余電子郵件的開頭都有空白,使查詢不返回任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.