当前位置: 首页 > 知识库问答 >
问题:

Mongodb$lookup无法使用_ID

沈运恒
2023-03-14

wend尝试此查询,返回查找为空

db.getCollection('tests').aggregate([
    {$match: {typet:'Req'}},
    {$project: {incharge:1}},
    {$lookup:{
            from: "users",
            localField: "incharge", //this is the _id user from tests
            foreignField: "_id", //this is the _id from users
            as: "user"
    }}
])

返回json

  [
    {
        "_id": "57565d2e45bd27b012fc4db9",
        "incharge": "549e0bb67371ecc804ad23ef",
        "user": []
    },
    {
        "_id": "57565d2045bd27b012fc4cbb",
        "incharge": "549e0bb67371ecc804ad21ef",
        "user": []
    },
    {
        "_id": "57565d2245bd27b012fc4cc7",
        "incharge": "549e0bb67371ecc804ad24ef",
        "user": []
    }
]

我尝试了这篇文章,但没有发生MongoDB将项目字符串聚合到ObjectId和这个MongoDB$lookup在PHP中使用_id作为foreignField

更新

这是文档“用户”

    {
        "_id" : ObjectId("549e0bb67371ecc804ad24ef"),
        "displayname" : "Jhon S."
    },
    {
        "_id" : ObjectId("549e0bb67371ecc804ad21ef"),
        "displayname" : "George F."
    },
    {
        "_id" : ObjectId("549e0bb67371ecc804ad23ef"),
        "displayname" : "Franc D."
    }

共有2个答案

芮宇航
2023-03-14

首先,断言incharge字段的类型为mongoose.schema.types.objectid。如果仍然返回空数组,可能是因为您使用了在NodeJS中声明的模式名,而不是MongoDB使用的集合名。

userschema文件中的示例:

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const UserSchema = new Schema({
  name: { 
    type: String, 
    required: true
  },
  incharge: { 
    type: Schema.Types.ObjectId, 
    required: true
  },
})

const User = mongoose.model('User', UserSchema)
module.exports = User

上面的模型由mongoose命名为user,但mongoDB中的相应集合命名为users。结果的$lookup写成:

$lookup:{
  from: "users",           // name of mongoDB collection, NOT mongoose model
  localField: "incharge",  // referenced users _id in the tests collection
  foreignField: "_id",     // _id from users
  as: "user"               // output array in returned object
}

https://mongoosejs.com/docs/models.html
https://mongoosejs.com/docs/schematypes.html

费锋
2023-03-14

我最终找到了解决方案,是我在mongoose中使用ObjectId的模式出现了问题

我换了这个

var Schema = new Schema({
    name: { type: String, required: true},
    incharge: { type: String, required: true},
});

用这个

var Schema = new Schema({
    name: { type: String, required: true},
    incharge: { type: mongoose.Schema.ObjectId, required: true},
});

正在工作

 类似资料:
  • 问题内容: 我有以下架构,其中项目类型可能有所不同,并在中提到。 我正在尝试进行动态查找,以便填充item对象。但这似乎不起作用。 我知道我可以使用,但想知道是否可以使用$ lookup 问题答案: 到目前为止,您还不能。该字段不能是表达式,而必须是字符串文字。但是,您可以在这里跟踪一个未解决的问题,该问题似乎恰恰是您所需要的:https : //jira.mongodb.org/browse/S

  • 问题内容: 我注意到一种奇怪的行为,我不确定这是设计使然还是我自己的误解。Spring将在以ComponentScan标记的@ Service,@ Component等注释的Bean中实现@Lookup方法,但不会在@Configuration类(Application.java)中定义的@Bean中实现这种方法。 这不是什么大问题,因为我可以从配置中删除@Bean定义,而直接对其类进行注释。但我

  • 问题内容: 我有两个模型,用户模型和时间表,我想用$ lookup 和猫鼬把这两个模型结合起来。 用户(型号) 时间表(型号) 现在我的查询使用猫鼬: 用户汇总 我的查询结果是一个空的array(),如下所示: 查询结果: 我不知道为什么,但是查询结果是一个 空数组 ,我试图使用$ unwind和$ match,但也无法正常工作。 编辑: 用户集合 时间表的收集 问题答案: 猫鼬在创建时将集合名称

  • 问题内容: 使用聚合,我使用golang加入了两个mongodb集合。结果如下所示:- 输出:- 此 输出 由以下golang代码获取:- 问题是: -我只需要的 不是 了。在上面显示的输出中意味着在其中显示数据,但是我只需要像这样的值:- 但它正在显示数据。如何获得输出中数据的计数值。先感谢您。 问题答案: 因此,您的汇总实际上返回了该字段中的所有文档,该文档隐含了结果的数量,您可以使用内置函数

  • 请帮我找到一个合适的解决办法 收集被存储的用户详细信息app_users 用户预订是存储预订的集合 我正在使用的查找(左连接)查询是 我想从用户集合中选择具有相应用户详细信息的预订,但返回为空,因为mongodb正在将字符串与objectId进行比较,所以是否有方法执行此任务?

  • 问题内容: 我是mongodb的新手,并在下面的文档中使用mongoose进行练习,并且遇到了一个非常令人困惑的问题。 我有用户架构 评论模式 和模型 然后我做 但是我在查询中得到空的共同点。根据数据库中的数据,我不应该得到这个结果。搜索后,我仍然找不到错误所在。 最后但并非最不重要的一点是,我需要使用方法,因此我必须在参考文件上使用,是否有意义? 问题答案: $ lookup中的字段是集合名称,