在多个字段上使用mongoose findById()?

时间:2016-04-01 16:12:45

标签: mongoose

我的模型看起来像这样

var mongoose = require('mongoose');
var tableSchema = new mongoose.Schema({
    version: { type: String, uppercase: true , required: true, trim: true },
    name: { type: String, uppercase: true , required: true, trim: true },
    descr: String
});
uctableSchema.index({ version: 1, name: 1 }, { unique: true }); 
module.exports = mongoose.model('Table', tableSchema); 

此模型将生成这样的集合

> db.tables.findOne()
{
        "_id" : ObjectId("56fc97d6e81ed6faf5e75b58"),
        "version" : "4",
        "name" : "address",
        "descr" : "contact address table"
}

一切都很好。我故意离开mongoose来生成auto _id。

我创建了一个独特的复合索引作为主键。

数据实际上是通过json文件从RDBMS导入的。所以mongoimport会为它自动生成_id。这很好。

_id值没有实际意义,我想通过复合主键检索,修改和删除数据。

在我的情况下,我还可以使用findById吗?

Model.findById(id, [projection], [options], [callback])
Model.findByIdAndUpdate(id, [update], [options], [callback])   
Model.findByIdAndRemove(id, [options], [callback])

我知道第一个参数id指的是我不想使用的_id。

有没有办法让id参数引用我的复合键,版本和名称?或者在我的情况下我根本不应该使用findById?

谢谢,

1 个答案:

答案 0 :(得分:2)

不,xxxById方法都只能用于_id

例如,这是findById的来源:

Model.findById = function findById(id, projection, options, callback) {
  if (typeof id === 'undefined') {
    id = null;
  }
  return this.findOne({_id: id}, projection, options, callback);
};

您需要使用更通用的findOnefindOneAndUpdatefindOneAndRemove方法。