Mongodb:如何执行子查询?

时间:2013-12-16 05:53:45

标签: node.js mongodb

我有进一步拥有数组的文档。我想查询作为先前查询的结果返回的数组。 例如,我有

{
{_id : 001,
 data: [{
        value: 1,
        name: 'Roger'
       },
       {value: 2,
        name: 'Albert'
       },
       {value: 3,
        name: 'Allen'
       }]
},
{_id: 002,
data: [{value: 4,
        name: 'Allison'
       },
       {value: 5,
        name: 'Tom'
       }]
}
}

我可以获取_id等于001的文档但是我想查询它的数据字段,其中值等于2和3.我不知道解决方法是什么。在SQL中可以使用子查询执行,但我不知道如何在mongodb中执行此操作。

2 个答案:

答案 0 :(得分:2)

也许你应该使用$ elemMatch: http://docs.mongodb.org/manual/reference/operator/query/elemMatch/

一个很好的例子: http://docs.mongodb.org/manual/reference/operator/query/all/

1.db.test.save({d: [{k1:1, v1:1}]}) 
2.db.test.save({d: [{k1:1, v1:1}]}) 
3.db.test.find({d:{$elemMatch:{k1:1}}}) 

返回:

{ "_id" : ObjectId("52aea61c54125a39453c8836"), "d" : [ { "k1" : 1, "v1" : 1 } ] }
{ "_id" : ObjectId("52aea62054125a39453c8837"), "d" : [ { "k1" : 1, "v1" : 1 } ] }

请注意,$ elemMatch查询与$ elemMatch投影不同。

答案 1 :(得分:0)

在2个不同的集合中插入2条记录以进行连接:

> db.employee.insert({eid:1,name:"premaseem"})
WriteResult({ "nInserted" : 1 })
> db.salary.insert({ eid:1, salary:6000 })
WriteResult({ "nInserted" : 1 })

2个表中的验证数据:

> db.salary.find({ eid:1})
{ "_id" : ObjectId("56da1a5b2253b2199c53025b"), "eid" : 1, "salary" : 6000 }
> db.salary.find({ eid: db.employee.find({eid:1})  })
> db.employee.find({name : "prem" })
{ "_id" : ObjectId("56da19d42253b2199c53025a"), "eid" : 1, "name" : "prem" }

模拟加入以获得员工premaseem的工资:

> db.employee.find({name : "premaseem" }).map(function(d){  var obj =  db.salary.findOne({eid : d.eid  }); print(obj.salary)  }  )
6000