首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongoose无需查询即可获取相关数据

mongoose无需查询即可获取相关数据
EN

Stack Overflow用户
提问于 2018-01-13 12:23:30
回答 2查看 180关注 0票数 1

我有这两个模式,水果模式和用户模式。我将它们分成两个不同的集合,但是一个水果模式可以引用一个用户。

代码语言:javascript
复制
const FruitSchema = new Schema({
  title: {
    type: String
  },
  buyer: {
    _id: {
      type: Schema.Types.ObjectId,
      default: null
    }
  }
})

const UserSchema = new Schema({
  name: {
    type: String
  },
  age: {
    type: Number
  },
  gender: {
    type: String
  }
})

如何查询所有包含用户信息的水果?我能想到的是找到所有的水果,获取buyer._id,然后找到每个用户,将它们映射回水果数组,听起来非常繁琐和复杂。如果是mysql,我就加入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-13 12:33:52

您需要使用$lookup来连接购买者id和用户id,对于所有匹配的集合,它将以嵌入文档的形式返回用户信息。

代码语言:javascript
复制
db.fruitz.aggregate(
    [
        {
            $lookup : {
                from : "userz",
                localField : "buyer_id",
                foreignField: "_id",
                as : "buyerInfo"
            }
        }
    ]
)

水果收藏

代码语言:javascript
复制
> db.fruitz.find().pretty()
{ "_id" : 2, "title" : "apple", "buyer_id" : 1 }
{ "_id" : 1, "title" : "banana", "buyer_id" : 2 }

users集合

代码语言:javascript
复制
> db.userz.find().pretty()
{ "_id" : 1, "name" : "abc", "age" : 20, "gender" : "M" }
> 

$lookup聚合

代码语言:javascript
复制
> db.fruitz.aggregate( [ { $lookup : { from : "userz", localField : "buyer_id", foreignField: "_id", as : "buyerInfo" } } ] ).pretty()

输出

代码语言:javascript
复制
{
    "_id" : 2,
    "title" : "apple",
    "buyer_id" : 1,
    "buyerInfo" : [
        {
            "_id" : 1,
            "name" : "abc",
            "age" : 20,
            "gender" : "M"
        }
    ]
}
{ "_id" : 1, "title" : "banana", "buyer_id" : 2, "buyerInfo" : [ ] }
> 
票数 1
EN

Stack Overflow用户

发布于 2018-01-13 12:40:42

MongoDB提供了$lookup来连接来自两个集合的记录:

在这种情况下,您可以使用$lookup连接水果和用户

代码语言:javascript
复制
db.fruits.aggregate([
   {
     $lookup:
       {
         from: "fruits",
         localField: "buyer",
         foreignField: "_id",
         as: "buyer_info"
       }
  }
])

$lookup hat在3.6中变得更强大了(如果你使用3.6),它允许添加表达式和你从right集合连接的东西

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48236888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档