Mongodb使用$ in在另一个查询中使用查询结果

时间:2014-05-13 17:18:54

标签: mongodb mongodb-query aggregation-framework non-relational-database document-based-database

我在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:这只是一个例子,我的问题是我无法将地址嵌入用户)

3 个答案:

答案 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并没有按照你的要求行事。