javascript - Mongoose 更新和插入数据的复杂查询

标签 javascript node.js mongodb mongoose

我有这样的模型:

var MyModel = new mongoose.Schema({
 key: String,
 array_values : [{
    value: String,
    counter: { type: Number, default: 1}
}];

我需要插入一个键值对,以便:

  1. 如果没有key,则添加一个新文档;
  2. 如果有 key ,则:
    • 如果 array_values 中有一个 value,则 counter 字段的值已增加,
    • 否则,如果没有这样的,则只是将新对象{key, counter}添加到array_value中。

例如有一个文档:

{
 key: "key",
 array_values: [{value: "value", counter: 1}]
}

插入{key: "key", value: "value"} 时应为:

{
 key: "key",
 array_values: [{value: "value", counter: 2}]
}

插入{key: "key_1", value: "value"}时,应添加一个文档:

{
 key: "key",
 array_values: [{value: "value", counter: 1}]
},
{
 key: "key_1",
 array_values: [{value: "value", counter: 1}]
}

插入{key: "key", value: "value_1"} 时应为:

{
 key: "key",
 array_values: [
    {value: "value", counter: 1}, 
    {value: "value_1", counter: 1}]
}

是否可以使用一个查询来完成此操作?

之前我用的是.findOne({key: 'findingKey'}),然后处理结果,但是速度很慢,要处理大量的key-value

更新:

这是我尝试做的事情:

我添加了一个静态函数:

MyModel.statics.addKeyValue = async function (key, value) {
    let item = await this.findOne({key: key}).exec();
    if (item) {
        const arr = item.array_values;
        let findItem = arr.find((arrItem) => {
            return arrItem.value === value;
        });

        if (findItem !== undefined) {
            findItem.count += 1;
        } else {
            item.array_values.push({value: value, counter: 1});
        }
        await item.save();
    } else {
        await this.create({
            key : key,
            array_values: [{value: value, counter: 1}]
        });
    }
};

但是插入 17 万个值需要超过 10 个小时

最佳答案

您可以尝试使用以下查询。它将从请求正文中查找具有提供的key的文档,并将根据 mongoose 查询返回的结果进行更新或创建。

MyModel.findOne({key: req.body.key}, (err, result) => {
    if (!result) {
        result = new Model();
        result.key = req.body.key;
        result.array_values = [];
    }
    result.array_values.push(req.body.array_values);
    result.save();
})

希望这对您有帮助。

关于javascript - Mongoose 更新和插入数据的复杂查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52585520/

相关文章:

javascript - Azure使用node js Sdk创建虚拟机

javascript - AWS S3 同步与 JS/Node 开发工具包

javascript - 在 PHP 中查询 MongoDB 后,将每个符号分配给 Javascript 中的索引

java - 我如何在 Spring 中编写此 Mongo 聚合查询?

javascript - Jquery 导航选项卡变化不大

javascript - 如何实现 dropzone.js 将文件上传到 Amazon s3 服务器?

javascript - 独立运行两个函数

javascript - 如何使用 TinyMCE 上传图像?

node.js - 如何使用 loopback.io 在 REST 中包含相关实体

javascript - 在字符串中传递 _id 和搜索查询