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



我在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集合地址的匹配文档。如果指定的名称在输入文档中已经存在,则覆盖现有字段。

相关内容

  • 没有找到相关文章

最新更新