【问题标题】:Can't find documents searching by ObjectId using Mongoose使用 Mongoose 找不到按 ObjectId 搜索的文档
【发布时间】:2011-12-14 06:44:09
【问题描述】:
  Campaign.find {client_id:req.param('client_id')}, (error, campaigns) ->
    if error
      response =
        error: error.message
    else
      for campaign in campaigns
        query =
          campaign_id: campaign._id
        console.log query
        CampaignResponse.find query, (err, campaignResponsesCount) ->
          console.log campaignResponsesCount

      response = campaigns

    res.json response

由于某种原因,这会返回 no 结果。但是,CampaignResponse 中有特定的campaign._id 项目。我很确定这是类型和转换的问题,但我不知道该怎么做。

有什么帮助吗?

【问题讨论】:

    标签: mongodb node.js mongoose


    【解决方案1】:

    不要使用 ObjectId 通过比较参数来查找,只需使用

    Campaign.findById {req.param('client_id'),function(err,docs)}....

    当使用 objectId 查找文档时,findById 是最有效的方法...

    【讨论】:

    • 这对文档的 _id 属性很有用。但 OP 的示例是查询关系 - 它正在寻找 client_id 属性。
    【解决方案2】:

    只是为了改进以前的(正确)答案,我在我的项目中使用:

    String.prototype.toObjectId = function() {
      var ObjectId = (require('mongoose').Types.ObjectId);
      return new ObjectId(this.toString());
    };
    
    // Every String can be casted in ObjectId now
    console.log('545f489dea12346454ae793b'.toObjectId());
    

    【讨论】:

    • 我建议先检查这种方法的存在:if (!String.prototype.toObjectId) { /* your implementation */ }
    • @Paul Rad 您认为最好在哪里实施?
    • @JakubBarczyk 我有点晚了,但是如果您要扩展内置对象,实际上不是首先检查它们是否存在是一个好主意除非您的脚本是 polyfill,因为 TC39 将来可能会扩展 JavaScript API。这就是将Array.includes 命名为原样的原因,而不是更合适的名称Array.contains:旧版本的MooTools 已经在Array.prototype 上添加了这样一个属性,并首先检查它是否存在。 MooTools 的算法与规范算法不同,并且使用频率很高,以至于添加规范版本破坏了很多网络。
    【解决方案3】:

    几个提示:

    • 尝试在命令行中从 mongodb 运行相同的查询,看看是否有任何结果。
    • “campaign_id”是否在您的架构中定义为 ObjectId?如果是这样,请尝试使用 ObjectId 类型进行搜索。

    例如:

    var ObjectId = require('mongoose').Types.ObjectId; 
    var query = { campaign_id: new ObjectId(campaign._id) };
    

    【讨论】:

    • 知道为什么 Mongoose 使用 ObjectId 插入,然后在查询时不使用 ObjectId?
    • 注意以下语句是等价的: var ObjectId = require('mongoose').Types.ObjectId; var ObjectId = require('mongodb').BSONPure.ObjectID;
    • 'new' 可能不需要; var query = { campaign_id: ObjectId(campaign._id) };
    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 2013-02-06
    • 2014-09-11
    • 2021-10-25
    • 2020-05-22
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多