我在mongo db中有以下模型:
用户集合
{
_id:12345,
name:15,
age:"Joe",
}
地址集
{
_id:7663,
userId:12345,
Street:"xyz",
number:"1235",
city:"New York",
state:"NY"
}
现在我想获得20岁以上用户的所有地址。我想查询20岁以上用户的所有ID,并使用$ in运算符查找地址。
我的问题是,有没有办法将其转换为一个查询?有更好的方法来查询吗? (obs:这只是一个例子,我的问题是我无法将地址嵌入用户)
答案 0 :(得分:7)
在Mongo shell中,您可以在另一个查询中使用一个查询的结果。例如:
use database // the name of your database
db.coll1.find({_id:{$nin:db.coll2.distinct("coll1_id")}})
此处集合coll1包含_id字段。然后,您可以检查不在集合coll2的coll1_id字段列表中的任何ID。因此,如果你在coll1中有记录而没有通过coll2中的coll1_id字段引用,那么这是一种清理两个表的方法。
另一种做同样事情的方法:
use database // the name of your database
temp = db.coll2.distinct("coll1_id");
db.coll1.find({_id:{$nin:temp}})
第一个例子在一个命令中执行,第二个例子在两个命令中执行,但概念是相同的。使用另一个查询中的结果。许多不同的方法来做到这一点。此外,如果你做的不仅仅是使用distinct(),那么.toArray()方法对于创建数组非常有用。
答案 1 :(得分:1)
使用聚合框架, $lookup
管道阶段提供加入两个集合的功能:
db.user.aggregate([
{ "$match": { "age": { "$gt": 20 } } },
{
"$lookup": {
"from": "addresses",
"localField": "_id",
"foreignField": "userId",
"as": "address"
}
}
])
以上内容将创建一个名为address
的新数组字段(在 $lookup
中指定为选项)并且包含匹配的文档来自集合地址。如果输入文档中已存在指定的名称,则会覆盖现有字段。
答案 2 :(得分:0)
你只能在应用程序级别执行此操作 - 意味着在一个查询中获取所有用户,在另一个查询中获取所有地址,并自己将其粘合在一起。 Mongo并没有按照你的要求行事。