通过子文档的 _id 查找 mongoose 文档

4
假设我有以下结构:
var Partner = require('../partner/partner.model');

var ContractSchema = new Schema({
      // blahblah
      partners: [Partner.schema]
});

所以这里每个合同都有一个合作伙伴数组,每个合作伙伴都有一个_id属性。

我想搜索一个具有特定_id合作伙伴的合同。 我尝试过以下代码,但无效:

  var ObjectId = require('mongoose').Types.ObjectId;    
  Contract.find({
      partners: {
        $elemMatch: {
          _id: {
            $eq: new ObjectId(req.query.partnerId)
          }
        }
      }
    }, function (err, serviceContracts) {
      if (err) {
        return handleError(res, err);
      } else {
        return res.status(200).json(serviceContracts);
      }
    });

编辑: 这里是我在数据库中的一个示例:

{
    "_id" : ObjectId("57e370e72beac9fc21c99ca3"),
    "updatedAt" : ISODate("2016-09-22T05:49:27.000Z"),
    "createdAt" : ISODate("2016-09-22T05:49:27.000Z"),
    "currency" : "USD",
    "partners" : [ 
        {
            "updatedAt" : ISODate("2016-09-22T05:49:27.000Z"),
            "createdAt" : ISODate("2016-09-22T05:49:27.000Z"),
            "name" : "Apple Inc.",
            "_id" : ObjectId("57e370e72beac9fc21c99caa")
        }
    ],
    "__v" : 0
}

1
首先将Contract.find({ partner: {替换为Contract.find({ partners: {,然后告诉... - Himanshu sharma
替换了,仍然不起作用。 - dnnagy
请问您能否提供您的一条记录合同表。 - Himanshu sharma
@Himanshusharma 添加了一个示例。 - dnnagy
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Daphoque
Contract.find({ 'partners._id' : req.query.partnerId }) - robertklep
1个回答

11

正如@robertklep所说,这个是可行的:

Contract.find({ "partners._id": req.query.partnerId})
  .then(function(contracts) {
    return res.status(200).json(contracts);
  })
  .catch(function(err) {
    return handleError(res, err);
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接