【问题标题】:Unable to get records by findOne() if I use custom id for inserting records in mongoDB如果我使用自定义 id 在 mongoDB 中插入记录,则无法通过 findOne() 获取记录
【发布时间】:2018-07-24 05:24:20
【问题描述】:

所以我使用

在我的 mongoDB 架构中插入了记录

> db.records.insert( { _id: "6", "name": "Ashish", "City": "Dallas" } )

当我尝试使用 http://localhost:6001/api/employees/ 获取它们时 我得到以下回复:

[{"name":"Chris","City":"New York"},{"name":"Ashish","City":"Dallas"},{"_id":"5a832ac77ffc3c4e149be718","name":"Sarthak","City":"New York"},{"_id":"5a833071e0184c27ff514c6f","number":"6","name":"Ashish","City":"Dallas"}]

请注意某些记录如何具有 _id 字段,而其他记录则没有。没有 _id 字段的记录是使用db.records.insert() 命令插入的记录。另外,如果我尝试获取那些自定义输入的记录,我会收到如下错误:

在尝试使用http://localhost:6001/api/employees/6 获取带有_id=6 的记录时,我得到:

{"message":"Cast to ObjectId failed for value \"6\" at path \"_id\" for model \"records\"","name":"CastError","stringValue":"\"6\"","kind":"ObjectId","value":"6","path":"_id"}

作为错误响应。我在我的 app.js 中使用以下代码来获取记录:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/testing');
var Employee = mongoose.model('records',mongoose.Schema({
    name:String,
    City:String,

}));

var cfenv = require("cfenv");
var appEnv = cfenv.getAppEnv();
var port = appEnv.port || 6016;

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
app.use(express.static(__dirname));

app.get('/api/employees',function(req,res){
    Employee.find(function(err,employees){
        if(err)
            return res.send(err);
        return res.json(employees);
    });
});

app.get('/api/employees/:id',function(req,res){
    Employee.findOne({_id: req.params.id},function(err,employees){
        if(err)
            return res.send(err);
        return res.json(employees);
    });
});

app.listen(port, function() {   
    console.log('server starting on ' + port);
});

数据库中的字段如指南针工具所示:

有什么想法吗?

【问题讨论】:

  • 你为什么要告诉mongo文档的_id?让mongo为你做一个。如果您不指定_id,它将是一个特殊的、唯一的标识值。看到这个:ObjectId。我猜猫鼬会过滤 _id 如果它是 ObjectId 类型。
  • 其实我觉得我可能看错了。尝试使用true/false 在架构中表明您愿意/不希望有一个_id。看到这篇文章:Schema option: _id.
  • 但这实际上是一个要求。我需要使用自定义 ID 映射文档,而不是一些任意定义的 ID。这就是整个问题。
  • 所以我需要删除我现有的db 架构并使用此选项创建一个新架构?
  • 您也可以使用自己的 id 字段来尝试覆盖 _id。您可以使用{_id:0} 过滤掉mongo 在投影步骤中跟踪的内部_id。见Projection

标签: angularjs node.js mongodb express


【解决方案1】:

mongoose 库默认尝试将所有_id 值转换为mongoose.Types.ObjectId。如果转换失败,它似乎会忽略该值。在您的情况下,您可能最安全的是定义 mongoose 如何处理架构中的 _id 字段。

var Employee = mongoose.model('records',mongoose.Schema({
    _id: String,
    name:String,
    City:String,

}));

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 2018-05-22
    • 2016-04-04
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多