传入的参数必须是12个字节的单个字符串

时间:2014-10-19 17:48:36

标签: node.js mongodb mongoose

mongoDB集合包含以下数据

db.stack.find()
{ "_id" : "8GieRu" }

_id不是12字节的单个字符串,

根据[ObjectID] [1]的MongoDB文档, id(字符串) - 可以是24字节的十六进制字符串,12字节的二进制字符串或数字。

使用Mongoose,可以使用此Json

访问此集合
{"_id" : new mongoose.Types.ObjectId("8GieRu")}

并抛出以下错误

/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:35
    throw new Error("Argument passed in must be a single String of 12 bytes or
          ^
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
    at new ObjectID (/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:35:11)

  [1]: http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html

Mongoose严格检查固定长度的ObjectId,如何使用给定长度的mongoose传递Object_id

6 个答案:

答案 0 :(得分:12)

你在这里混合了两个概念。

虽然“_id”可以有任何值(即使像{firstName:'Foo',lastName:'Simpson'}这样的子文档,“ObjectId”也有一组固定的类型,但有一些限制,因为错误信息正确地说明了。

所以你的陈述应该是

{'_id':'putWhatEverYouWantHere'}

答案 1 :(得分:5)

我在路由器订单中遇到了问题:

app.get('/jobs', controllers.jobs.getAllJobs);
app.get('/jobs/karriere', controllers.jobs.getAllJobsXML);

app.get('/jobs/:id', controllers.jobs.getJob);
app.get('/jobs/:id/xml', controllers.jobs.getJobXML);

我在 / jobs /:id之后定义了/ jobs / karriere ,因此应用程序认为“karriere”是ObjectID并返回错误。上面的代码是工作代码。

答案 2 :(得分:1)

确保您在客户端和服务器端使用的方法匹配。如果您有例如此错误也会显示{}从客户端发送POST,服务器端需要MainWindow

答案 3 :(得分:0)

我遇到了同样的问题,但在RND之后。我确定自己传递了错误的{Id:Undefined},因此出现了问题,因此请首先检查您在URL中传递的ID。

      Error = "http://localhost:4000/api/deleteBook/Undefined"
      Right = "http://localhost:4000/api/deleteBook/5bb9e79df82c0151fc0cd5c8"

答案 4 :(得分:0)

您通过了

find /homee -type f -not -path '/\.*' -exec du -hs {} + |sort -r -n -k7 |sed 's/.*\///' | nl

如果未定义ObjectID,则会出现此错误。

答案 5 :(得分:0)

就我而言,我正在使用猫鼬。而且我无法使用以下查询:

{ "_id" : "8GieRu" }

直到我碰到我的模型文件并指定这行counter.model.js

var CounterSchema = new Schema({
  _id: String,
  sequence_value: Number
})

请注意,我在模型中将数据类型指定为_id的字符串。 而且,在我的查询中,我不需要将字符串转换为ObjectId。

查询现在就像过滤器一样简单

{ "_id" : "8GieRu" }