也许是时候了,也许是我淹没在稀疏的文档中,无法理解在Mongoose中更新的概念:)

交易如下:

我有一个联系人模式和型号(简称属性):

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var mongooseTypes = require("mongoose-types"),
    useTimestamps = mongooseTypes.useTimestamps;


var ContactSchema = new Schema({
    phone: {
        type: String,
        index: {
            unique: true,
            dropDups: true
        }
    },
    status: {
        type: String,
        lowercase: true,
        trim: true,
        default: 'on'
    }
});
ContactSchema.plugin(useTimestamps);
var Contact = mongoose.model('Contact', ContactSchema);

我收到客户的请求,其中包含我需要的字段,并使用我的模型:

mongoose.connect(connectionString);
var contact = new Contact({
    phone: request.phone,
    status: request.status
});

现在我们来解决这个问题:

  1. 如果我呼叫contact.save(function(err){...}),如果具有相同电话号码的联系人已经存在(如预期的那样-唯一),我将收到一个错误
  2. 我无法在联系时拨打update(),因为文档中不存在这种方法
  3. If I call update on the model:
    Contact.update({phone:request.phone}, contact, {upsert: true}, function(err{...})
    I get into an infinite loop of some sorts, since the Mongoose update implementation clearly doesn't want an object as the second parameter.
  4. 如果我也这样做,但在第二个参数中,我传递了一个请求属性{status: request.status, phone: request.phone ...}的关联数组,它可以工作——但是我没有特定联系人的引用,无法找到它的createdAtupdatedAt属性.

所以,在我try 了这么多之后,底线是:给定一个文档contact,如果它存在,我该如何更新它,如果它不存在,我该如何添加它?

谢谢你抽出时间.

推荐答案

我等得够久了,没有回答.最终放弃了整个更新/升级方法, Select 了:

ContactSchema.findOne({phone: request.phone}, function(err, contact) {
    if(!err) {
        if(!contact) {
            contact = new ContactSchema();
            contact.phone = request.phone;
        }
        contact.status = request.status;
        contact.save(function(err) {
            if(!err) {
                console.log("contact " + contact.phone + " created at " + contact.createdAt + " updated at " + contact.updatedAt);
            }
            else {
                console.log("Error: could not save contact " + contact.phone);
            }
        });
    }
});

有效吗?是的.我对这个满意吗?可能不会.2个DB呼叫,而不是1个

Javascript相关问答推荐

使用续集和下拉栏显示模型属性

yarn安装一个本地npm包,以便本地包使用main项目的node_modules(ckeditor-duplicated-modules错误)

Chrome是否忽略WebAuthentication userVerification设置?""

引用在HTMLAttributes<;HTMLDivElement>;中不可用

查找最长的子序列-无法重置数组

如何从隐藏/显示中删除其中一个点击?

PDF工具包阿拉伯字体的反转数字

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

JS:XML insertBefore插入元素

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

类构造函数不能在没有用With Router包装的情况下调用

将数组扩展到对象中

将异步回调转换为异步生成器模式

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

当从其他文件创建类实例时,为什么工作线程不工作?

如何将对象推送到firestore数组?

Reaction-在同一页内滚动导航(下拉菜单)

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

Node.js的Fetch()调用总是创建新的Express会话