簡體   English   中英

Mongo查詢搜索更新一個$ elemmatch

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM