Mongodb/mongoose插入不是一个函数

7
我的插入功能不起作用,出现了错误:
Token.insert 不是一个函数。
var Token = module.exports = mongoose.model('tokens', tokenSchema);

//error
module.exports.saveToken = function(owner_id, token, callback){
    console.log(owner_id,token);
    Token.insert({"owner":owner_id,"token":token},callback);
}
//working
module.exports.getAllTokens = function(owner_id, callback){
    Token.find({"owner":owner_id},callback);
}

1
这个文件中是否定义了 Token?它是如何传递给它的? - Mukesh Sharma
@MukeshSharma 更新了我的问题。 - Alicia Brandon
请添加 tokenSchema 的定义,并准确描述问题。您说:Token.insert 不是一个函数。我们可以帮您解决,但在此之前,您需要将 token 插入 token 数组中。因此,请修正您的问题。 - num8er
3个回答

3

请查看这个代码示例,它应该按照您的要求正常工作。

我在这里没有看到任何难以理解的地方。

如果有任何问题,请在评论中提出,我可以解释不理解的部分。

var tokenSchema = mongoose.Schema({
  owner: { 
    type: 'String',
    required: true,
    index: {
      unique: true
    }
  }, 
  token: {
    type: ['String'],
    default: []
  }
});

var Token = module.exports = mongoose.model('tokens', tokenSchema);

//save token, if token document exist so push it in token array and save
module.exports.saveToken = function(owner_id, token, callback){
    Token
      .findOne({owner: owner_id})
      .exec(function(err, tokenDocument) {
        if(tokenDocument) {
          if(tokenDocument.token.indexOf(token) > -1) { // found that token already exist in document token array
            return callback(null, tokenDocument); // don't do anything and return to callback existing tokenDocument
          }

          tokenDocument.token.push(token);
          tokenDocument.save(callback);
          return; // don't go down, cuz we already have a token document
        }

        new Token({owner: owner_id, token: [token]}).save(callback); // create new token document with single token in token array
    });
}

//get all tokens by owner_id
module.exports.getAllTokens = function(owner_id, callback){
    Token
      .findOne({owner: owner_id})
      .exec(function(err, tokenDocument) {
        callback(err, tokenDocument.token);
      });
}

1
这段代码无法运行,我忘了提到我的模式中token是一个数组。像这样 var tokenSchema = mongoose.Schema({ "owner" : { type:String }, "token" : [] }); - Alicia Brandon
问题在于如果所有者相同,它仍会创建另一组插入。如果所有者相同,如何只推送令牌而不重复整个文档? - Alicia Brandon
检查“更好的解决方案”,如果所有者存在,则通过其获取令牌并推送新令牌并保存它。否则,在其中创建具有单个令牌的新记录。 - num8er
在findOne回调函数中,return关键字的作用是什么? - Alicia Brandon
1
非常感谢你的帮助,亲爱的! - Alicia Brandon
显示剩余7条评论

1

您可以使用:

let newvalue = new Token({"owner":owner_id,"token":token});
newvalue.save();

saveinsertcreate有什么不同? - Alicia Brandon
1
很愚蠢的是Mongoose没有插入API,因为这是本机API,我猜想Model.create()取代了Model.insert()的位置。 - Alexander Mills

1

在这里,我定义了为什么他们没有找到insertMany的问题。

通常,我们创建一个实例来保存文档在数据库中,像这样:

const instance = new Model(data);

然后我们点击保存查询

instance.save(data).then().catch()

但是当我们谈论到insertMany部分时,不需要创建任何实例。你可以通过Model直接插入所有条目。
例如。
Modal.insertMany(data).then().catch()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接