【问题标题】:Mongo query search updateOne $elemmatchMongo 查询搜索 updateOne $elemmatch
【发布时间】: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


【解决方案1】:

问题是您存储后续电子邮件而不修剪它们,因为您可以看到只有第一封电子邮件被正确修剪,但其余的在开头有一个空格,使得查询不返回任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 2021-08-14
    • 2017-05-04
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2013-04-29
    • 2021-01-03
    相关资源
    最近更新 更多