我在mongo数据库中有以下模型:
用户集合
{
_id:12345,
name:"Joe",
age:15,
}
地址集合
{
_id:7663,
userId:12345,
Street:"xyz",
number:"1235",
city:"New York",
state:"NY"
}
现在我想获得所有年龄在20岁以上的用户的地址。我的想法是查询所有超过20的用户的id,并使用这个查询的结果使用$in操作符来查找地址。
我的问题是,有没有办法把这个变成一个查询?有更好的方法来查询这个吗?(obs:这只是一个例子,我的问题,我不能嵌入地址到用户)
在Mongo shell中,您可以在另一个查询中使用一个查询的结果。例如:
use database // the name of your database
db.coll1.find({_id:{$nin:db.coll2.distinct("coll1_id")}})
collection coll1包含一个_id字段。然后,您可以检查coll1_id字段的coll2集合列表中没有的任何id。如果coll1中的记录没有通过coll1_id字段在coll2中引用,那么这是一种清理两个表的方法。
另一种方法做同样的事情:
use database // the name of your database
temp = db.coll2.distinct("coll1_id");
db.coll1.find({_id:{$nin:temp}})
第一个示例在一个命令中完成,第二个示例在两个命令中完成,但概念是相同的。在另一个查询中使用一个查询的结果。有很多不同的方法。此外,如果您要做的不仅仅是使用distinct(),那么. toarray()方法对于创建数组也很有用。
使用聚合框架,其中 $lookup
管道阶段提供连接两个集合的功能:
db.user.aggregate([
{ "$match": { "age": { "$gt": 20 } } },
{
"$lookup": {
"from": "addresses",
"localField": "_id",
"foreignField": "userId",
"as": "address"
}
}
])
上面将创建一个名为address
的新数组字段(在 $lookup
as选项中指定),它包含来自from集合地址的匹配文档。如果指定的名称在输入文档中已经存在,则覆盖现有字段。