【问题标题】:How to retrieve parent document based on subdocument values in Mongoose?如何根据 Mongoose 中的子文档值检索父文档?
【发布时间】:2013-03-19 03:48:35
【问题描述】:

我有以下架构:

var Child = new mongoose.Schema({
    'field': String,
    'value': String
  });

var Parent = new mongoose.Schema({
    'name': String,
    'children': [ Child ]
  });

我想返回 Parent 中的一个 Child 对应于以下 JSON 对象:

{ 'field': 'Family Name', 'value': 'Smith' }

我试过这个:

Parent.findOne({ 'children': { 'field': 'Family Name', 'value': 'Smith' } }, fn ...)

但它继续检索null

编辑:

通过Mongo shell扩展测试,我发现Child子文档有自己的_id。如果我将 _id 添加到查询中,它将获取 parent 文档。现在,我提前不知道那个孩子id 会是什么。那么:如何从子文档查询中删除它? (换句话说,上面的查询从字面上寻找一个只有两个属性的 JSON 对象,而子文档有三个)

我的环境是:Node.js、Mongoose、MongoDB

【问题讨论】:

  • 如果您有子对象,您可以调用child.parent()。如果你不这样做,那么是的,你需要查询它。
  • 我没有child 对象,因此是查询。但是查询本身似乎没有获取任何parent...

标签: json node.js mongodb mongoose


【解决方案1】:

您在子文档上使用字段、值结构是否有原因?简单地将键用作字段会更容易,例如{"FamilyName": "Smith"}。这将允许类似:

Parent.findOne({'children.FamilyName': 'Smith'}, function(err, doc){...});

【讨论】:

  • 确实,但我有一个动态模型,因此结构有些扩展。与此同时,我找到了解决方案;稍后会发布它
【解决方案2】:

看来$elemMatch 是解决此问题的查询运算符。实际查询应该这样写:

Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...)

【讨论】:

  • 我试图弄清楚如何使 $elemMatch 在子子子文档上工作。你试过这样的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2017-01-11
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多