找不到带有查询字符串参数的文档

时间:2015-09-05 13:15:30

标签: javascript node.js mongodb express mongoose

我正在尝试使用查询字符串在我的数据库中查找文档,该字符串引用user_id架构上定义的profile,如下所示:

ProfileSchema = Schema(
  user_id: type: Schema.Types.ObjectId
  vehicules: [VehiculeSchema]
  home: {type:Schema.Types.ObjectId, ref: 'home'}
  travel: [TravelSchema]
  diet: {type:Schema.Types.ObjectId, ref: 'diet'}
  actions: [ActionSchema]
)

当我在mongo shell中运行db.profiles.find({user_id: "55e3393e95cafd4c23a00756"})时,我找到了我的文档:

{ "_id" : ObjectId("55e3393e95cafd4c23a00757"), "user_id" : "55e3393e95cafd4c23a00756", "actions" : [ ], "diet" : [ { "portion_period" : "year", "portions" : 1, "footprint" : 100, "type" : "fish" } ], "travel" : [ ], "energy" : [ { "bill" : "100", "period" : "month", "type" : "electricity" }, { "period" : "week", "type" : "electricity" }, { "period" : "month", "type" : "gas" } ], "vehicules" : [ ], "commute" : [ ], "__v" : 0 }

但是,当使用mongoose orm在我的代码中执行相同的查询时,它找不到该文档。 语法是coffeescript

Profile.find {user_id: ObjectId(req.query.user_id)}, (err, profile)->
  console.log 'FINDING PROFILE', arguments
    if !err
      if profile
        res.json profiles:[profile]
      else
        res.sendStatus 404

我也试过没有将结果强制转换为ObjectId,但没有取得更多成功。 我还尝试使用findOne而不是find,但它返回null而不是空数组。

1 个答案:

答案 0 :(得分:1)

{ "_id" : ObjectId("55e3393e95cafd4c23a00757"), "user_id" : "55e3393e95cafd4c23a00756"...

此文档将userId存储为String的十六进制ObjectId表示形式,而不是ObjectId本身。 MongoDB中的查询是类型敏感的,因此String("55e3393e95cafd4c23a00756")ObjectId("55e3393e95cafd4c23a00756")的序列化方式不同。当MongoDB客户端遇到ObjectId实例时,会将其序列化为BSON ObjectId类型。

Profile.find {user_id: req.query.user_id}, (err, profile)-> ...

将适用于此特定文档,尽管将它们存储为合适的ObjectId将是更好的选择。