【问题标题】:Mongo db using result of query in another query using $inMongodb 在另一个使用 $in 的查询中使用查询结果
【发布时间】:2014-07-01 12:14:57
【问题描述】:

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

【问题讨论】:

  • 是的,我知道 mongo db 不支持连接。我想了解的是,解决上面列出的问题的最佳方法是什么。例如,有什么方法可以获取用户的所有 id 并将其放入另一个查询中?
  • “最佳方式”问题通常不适合 SO,但如果您更新问题以包含使用 $in 执行此操作的代码,并且您对某个问题有特定疑问使用这种方法,效果会更好。
  • 问题实际上是为了更好地理解 mongo DB。我没有现实生活中的问题。但这里有:我知道我可以从这样的用户那里获取 ID 列表:db.users.find({age:{$gt:20}}) 我知道我可以像这样查询地址列表:db.addresses.find({userId:{$in:[123,124,125,126]}}) 我知道我可以投射第一个查询以仅返回 Id ,我唯一不知道的是我是否可以在第二个查询中使用第一个查询的结果。如果这是不可能的,有没有其他方法可以用第一个集合的结果查询第二个集合?
  • 当然,看到这个问题:stackoverflow.com/q/22318719/1259510

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


【解决方案1】:

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

【讨论】:

  • 非常有帮助,这样可以省去编写一些程序来清除孤儿院。
  • 这太棒了,为我想要的功能省去了很多痛苦。谢谢!
  • 甜蜜!我们使用的是var temp 而不仅仅是temp,它没有工作好几个小时。感谢您的澄清!
【解决方案2】:

使用聚合框架,其中 $lookup 管道阶段提供了连接两个集合的功能:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2016-05-08
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多