如何根据Mongoose中的子文档值检索父文档?

Ze *_*ibe 7 json mongoose mongodb node.js

我有以下架构:

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

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

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

{ 'field': 'Family Name', 'value': 'Smith' }
Run Code Online (Sandbox Code Playgroud)

我试过这个:

Parent.findOne({ 'children': { 'field': 'Family Name', 'value': 'Smith' } }, fn ...)
Run Code Online (Sandbox Code Playgroud)

但它一直在检索null.

编辑:

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

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

Ze *_*ibe 10

似乎$elemMatch是查询运算符来解决这个问题.实际查询应写成如下:

Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...)
Run Code Online (Sandbox Code Playgroud)


tbe*_*eda 5

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

Parent.findOne({'children.FamilyName': 'Smith'}, function(err, doc){...});
Run Code Online (Sandbox Code Playgroud)