mongodb 如何在Mongoose中将_id设置为db文档?

ccrfmcuu  于 12个月前  发布在  Go
关注(0)|答案(5)|浏览(152)

我试图通过统计数据库中的文档数量来动态地为Mongoose模型创建_id,并使用该数字来创建_id(假设第一个_id为0)。然而,我无法从我的值中获取要设置的_id。下面是我的代码:

//Schemas
var Post = new mongoose.Schema({
    //_id: Number,
    title: String,
    content: String,
    tags: [ String ]
});

var count = 16;

//Models
var PostModel = mongoose.model( 'Post', Post );

app.post( '/', function( request, response ) {

    var post = new PostModel({
        _id: count,
        title: request.body.title,
        content: request.body.content,
        tags: request.body.tags
    });

    post.save( function( err ) {
        if( !err ) {
            return console.log( 'Post saved');
        } else {
            console.log( err );
        }
    });

    count++;

    return response.send(post);
});

字符串
我尝试了许多不同的方法来设置_id,但对我来说都不起作用。下面是最新的错误:

{ message: 'Cast to ObjectId failed for value "16" at path "_id"',
  name: 'CastError',
  type: 'ObjectId',
  value: 16,
  path: '_id' }


如果你知道发生了什么事,请告诉我。

lp0sw83n

lp0sw83n1#

您需要将_id属性声明为schema的一部分(您已将其注解掉),或者使用_id选项并将其设置为false(您使用的是id选项,该选项创建了一个虚拟getter以将_id转换为字符串,但仍然创建了_id ObjectID属性,因此会出现转换错误)。
所以要么这样:

var Post = new mongoose.Schema({
    _id: Number,
    title: String,
    content: String,
    tags: [ String ]
});

字符串
或者这个:

var Post = new mongoose.Schema({
    title: String,
    content: String,
    tags: [ String ]
}, { _id: false });

kzmpq1sx

kzmpq1sx2#

@robertklep的第一段代码对我不起作用(mongoose 4),还需要禁用_id

var Post = new mongoose.Schema({
  _id: Number,
  title: String,
  content: String,
  tags: [ String ]
}, { _id: false });

字符串
这对我很有效

tpgth1q7

tpgth1q73#

在mongoose中创建custom _id并将其保存为mongo _id。在保存文档之前使用mongo _id。

const mongoose = require('mongoose');
    const Post = new mongoose.Schema({
          title: String,
          content: String,
          tags: [ String ]
        }, { _id: false });

// request body to save

let post = new PostModel({
        _id: new mongoose.Types.ObjectId().toHexString(), //5cd5308e695db945d3cc81a9
        title: request.body.title,
        content: request.body.content,
        tags: request.body.tags
    });

post.save();

字符串

f2uvfpb9

f2uvfpb94#

当我为模式保存新数据时,这对我很有效。

new User(
    {
      email: thePendingUser.email,
      first_name: first_name || thePendingUser.first_name,
      last_name: last_name || thePendingUser.last_name,
      sdgUser: thePendingUser.sdgUser,
      sdgStatus: "active",
      createdAt: thePendingUser.createdAt,
      _id: thePendingUser._id,
    },
    { _id: thePendingUser._id }
  )

字符串

t1rydlwq

t1rydlwq5#

下面是我正在做的。我只是添加了一个前保存钩子来设置_id字段。

// Hooks
// custom _id schema
modelSchema.pre('save', function (next) {
  // Only set custom _id if the document is new
  if (this.isNew) {
    this._id = ModelServiceHelpers.getIdKey({ firstPartId: this.userId, secondPartId: this.memberId });
  }
  next();
});

字符串

相关问题