我有以下架构:
var Child = new mongoose.Schema({
'field': String,
'value': String
});
var Parent = new mongoose.Schema({
'name': String,
'children': [ Child ]
});
我想返回Parent
的{{1}}对应于以下JSON对象:
Child
我试过这个:
{ 'field': 'Family Name', 'value': 'Smith' }
但它一直在检索Parent.findOne({ 'children': { 'field': 'Family Name', 'value': 'Smith' } }, fn ...)
。
修改
通过Mongo shell扩展测试,我发现null
子文档有自己的Child
。如果我将_id
添加到查询中,则会获取_id
文档。现在,我事先并不知道那个孩子parent
会是什么。那么:如何从子文档查询中删除它? (换句话说,上面的查询字面上查找只有两个属性的JSON对象,而子文档有三个)
我的环境是:Node.js,Mongoose,MongoDB
答案 0 :(得分:10)
$elemMatch
似乎是解决此问题的查询运算符。实际查询应写如下:
Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...)
答案 1 :(得分:4)
您是否有理由在子文档中使用字段,值结构?简单地将密钥用作字段会更容易,例如{"FamilyName": "Smith"}
。这将允许类似:
Parent.findOne({'children.FamilyName': 'Smith}, function(err, doc){...});