15

我在 mongo db 中有以下模型:

用户集合

{
_id:12345,
name:"Joe",
age:15,
}

地址集合

{
_id:7663,
userId:12345,
Street:"xyz",
number:"1235",
city:"New York",
state:"NY"
}

现在我想获取 20 岁以上用户的所有地址。我的想法是查询 20 岁以上用户的所有 id,并使用此查询的结果使用 $in 运算符查找地址。

我的问题是,有没有办法把它变成一个查询?有没有更好的方法来查询这个?(obs:这只是一个例子,我的问题是我无法将地址嵌入到用户中)

4

2 回答 2

15

在 Mongo shell 中,您可以在另一个查询中使用一个查询的结果。例如:

use database  // the name of your database
db.coll1.find({_id:{$nin:db.coll2.distinct("coll1_id")}})

这里collection 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() 方法对于创建数组也很有用。

于 2016-04-15T22:40:54.197 回答
6

使用$lookup流水线阶段提供连接两个集合的功能的聚合框架:

db.user.aggregate([
    { "$match": { "age": { "$gt": 20 } } },
    {
        "$lookup": {
            "from": "addresses",
            "localField": "_id",
            "foreignField": "userId",
            "as": "address"
        }
    }
])

上面将创建一个名为address(在as选项中指定)的新数组字段,其中包含来自 from 集合地址的匹配文档。如果输入文档中已经存在指定的名称,则覆盖现有字段。$lookup

于 2017-02-07T11:42:22.213 回答