9

我有以下架构:

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

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

我想返回对应于以下 JSON 对象Parent的 's 之一:Child

{ '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

4

2 回答 2

10

似乎$elemMatch是查询运算符来解决这个问题。实际查询应该这样写:

Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...)
于 2013-03-28T16:37:19.597 回答
5

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

Parent.findOne({'children.FamilyName': 'Smith'}, function(err, doc){...});
于 2013-03-28T16:30:47.517 回答