2

基本上,我正在尝试计算集合中的文档,并将新文档设置为_id。我尝试了许多组合,但似乎没有一个有效。

这是我尝试过的:

var count = PostModel.find( function( err, posts ) {
    if ( !err ) {
        return posts.length;
    }
    else {
        return console.log( err );
    }
});

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

回报:

{ message: 'Cast to number failed for value "[object Object]" at path "_id"',
  name: 'CastError',
  type: 'number',
  value:
   { options: { populate: {} },
     safe: undefined,
     _conditions: {},
     _updateArg: {},
     _fields: undefined,
     op: 'find',
     model:
      { [Function: model]
        modelName: 'Post',
        model: [Function: model],
        options: undefined,
        db: [Object],
        schema: [Object],
        collection: [Object],
        base: [Object] } },
  path: '_id' }

还有这个:

var post = new PostModel({
    _id: PostModel.find( function( err, posts ) {
        if ( !err ) {
            return posts.length;
        }
        else {
            return console.log( err );
        }
    }),
    title: request.body.title,
    content: request.body.content,
    tags: request.body.tags
});

返回相同的错误。但是,当我单独添加以下内容时,它会记录集合的长度:

PostModel.find( function( err, posts ) {
    if ( !err ) {
        return console.log(posts.length);
    }
    else {
        return console.log( err );
    }
});

我也尝试count()以各种方式使用,但我无法取得任何进展。有关如何查询集合以获取计数并将其设置为 _id 的任何见解都会非常有帮助。

4

1 回答 1

2

首先,在 MongoBD 中不建议这样做,因为它不能很好地扩展。

但是,如果您真的想这样做,官方 MongoDB 文档中的说明一种很好且安全的方法。

基本上,您使用一个小文档来保存当前序列 ID,每次插入文档时,您都会读取并自动增加该序列。这比每次插入时都计算文档效率高得多。

使用您的解决方案,如果两个进程同时运行会发生什么?您最终可能会得到相同的 ID,因为您的插入和序列生成/计数不是原子的。

编辑:

要从您的模型中获取计数,请使用以下命令:

PostModel.count( function (err, count) {
  if (err) ..
  console.log('there are %d posts', count);
});

由 OP 编辑​​:

根据下面的评论,问题在于同步使用异步函数。当所有代码都移到回调函数中时,它就起作用了。这是解决方案:

PostModel.count( function (err, count) {
    if (err)
        console.log(err);
    else {
        console.log('there are %d posts', count);

        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 );
            }
        });

        return response.send(post);
    }
});
于 2013-11-04T03:25:42.223 回答