Populate() 引用嵌套在对象数组中

2023-11-30

我正在尝试使用 Show 模型中的数据填充()我的 User 模型中的所有订阅。我尝试过 .populate('subscriptions.show') 但它对结果没有任何作用。

如果我将订阅设为一个简单的参考数组,如下所示

subscriptions: [{type: Schema.Types.ObjectId, ref: 'Show'}]

执行 populate('subscriptions') 按预期工作

我查看了在 Stackoverflow 上可以找到的每个类似问题以及在文档中可以找到的内容。我看不出我做错了什么。

我正在使用的完整测试文件源https://gist.github.com/anonymous/b7b6d6752aabdd1f9b59

架构和模型

var userSchema = new Schema({
  email: String,
  displayName: String,
  subscriptions: [{
    show: {type: Schema.Types.ObjectId, ref: 'Show'},
    favorite: {type: Boolean, default: false}
  }]
});

var showSchema = new Schema({
  title: String,
  overview: String,
  subscribers: [{type: Schema.Types.ObjectId, ref: 'User'}],
  episodes: [{
    title: String,
    firstAired: Date
  }]
});

var User = mongoose.model('User', userSchema);
var Show = mongoose.model('Show', showSchema);

初始数据

var user = new User({
  email: "[email protected]",
  displayName: "bill"
});

user.save(function(err, user) {
  var show = new Show({
    title: "Some Show",
    overview: "A show about some stuff."
  });

  show.save();
  user.subscriptions.push(show);
  user.save();
});

查询

User.findOne({
  displayName: 'bill'
})
  .populate('subscriptions.show')
  .exec(function(err, user) {
    if (err) {
      console.log(err);
    }

    console.log(user);
  });

结果是:

{
  _id: 53a7a39d878a965c4de0b7f2,
  email: '[email protected]',
  displayName: 'bill',
  __v: 1,
  subscriptions: [{
    _id: 53a7a39d878a965c4de0b7f3,
    favorite: false
  }]
}

也许是一些代码,还有对您的方法的一些更正。您想要一种“manyToMany”类型的联接,可以按如下方式进行:

var async = require("async"),
    mongoose = require("mongoose"),
    Schema = mongoose.Schema;


mongoose.connect('mongodb://localhost/user');


var userSchema = new Schema({
  email: String,
  displayName: String,
  subscriptions: [{ type: Schema.Types.ObjectId, ref: 'UserShow' }]
});

userShows = new Schema({
  show: { type: Schema.Types.ObjectId, Ref: 'Show' },
  favorite: { type: Boolean, default: false }
});

var showSchema = new Schema({
  title: String,
  overview: String,
  subscribers: [{ type: Schema.Types.ObjectId, ref: 'User' }],
  episodes: [{
    title: String,
    firstAired: Date
  }]
});


var User = mongoose.model('User', userSchema);
var Show = mongoose.model('Show', showSchema);
var UserShow = mongoose.model('UserShow', userShows);

var user = new User({
  email: '[email protected]',
  displayName: 'bill'
});

user.save(function(err,user) {

  var show = new Show({
    title: "Some Show",
    overview: "A show about some stuff."
  });

  show.subscribers.push( user._id );
  show.save(function(err,show) {
    var userShow = new UserShow({ show: show._id });
    user.subscriptions.push( userShow._id );
    userShow.save(function(err,userShow) {
      user.save(function(err,user) {
        console.log( "done" );
        User.findOne({ displayName: "bill" })
          .populate("subscriptions").exec(function(err,user) {

          async.forEach(user.subscriptions,function(subscription,callback) {
              Show.populate(
                subscription,
                { path: "show" },
              function(err,output) {
                if (err) throw err;
                callback();
              });

          },function(err) {
            console.log( JSON.stringify( user, undefined, 4) );
          });


        });
      });
    });
  });

});

这应该显示一个类似于这样的填充响应:

{
    "_id": "53a7b8e60462281231f2aa18",
    "email": "[email protected]",
    "displayName": "bill",
    "__v": 1,
    "subscriptions": [
        {
            "_id": "53a7b8e60462281231f2aa1a",
            "show": {
                "_id": "53a7b8e60462281231f2aa19",
                "title": "Some Show",
                "overview": "A show about some stuff.",
                "__v": 0,
                "episodes": [],
                "subscribers": [
                    "53a7b8e60462281231f2aa18"
                ]
            },
            "__v": 0,
            "favorite": false
        }
    ]
}

或者没有“manyToMany”也可以。请注意,这里没有初始调用来填充:

var async = require("async"),
    mongoose = require("mongoose"),
    Schema = mongoose.Schema;


mongoose.connect('mongodb://localhost/user');


var userSchema = new Schema({
  email: String,
  displayName: String,
  subscriptions: [{
    show: {type: Schema.Types.ObjectId, ref: 'UserShow' },
    favorite: { type: Boolean, default: false }
  }]
});


var showSchema = new Schema({
  title: String,
  overview: String,
  subscribers: [{ type: Schema.Types.ObjectId, ref: 'User' }],
  episodes: [{
    title: String,
    firstAired: Date
  }]
});


var User = mongoose.model('User', userSchema);
var Show = mongoose.model('Show', showSchema);

var user = new User({
  email: '[email protected]',
  displayName: 'bill'
});

user.save(function(err,user) {

  var show = new Show({
    title: "Some Show",
    overview: "A show about some stuff."
  });

  show.subscribers.push( user._id );
  show.save(function(err,show) {
    user.subscriptions.push({ show: show._id });
    user.save(function(err,user) {
        console.log( "done" );
        User.findOne({ displayName: "bill" }).exec(function(err,user) {

          async.forEach(user.subscriptions,function(subscription,callback) {
              Show.populate(
                subscription,
                { path: "show" },
              function(err,output) {
                if (err) throw err;
                callback();
              });

          },function(err) {
            console.log( JSON.stringify( user, undefined, 4) );
          });


        });
    });
  });

});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Populate() 引用嵌套在对象数组中 的相关文章

随机推荐

  • Arm trustzone监控模式开关设计

    基本的世界切换流程是 将FIQ设置为监控模式 normal world gt FIQ triggered gt 进入监控模式 切换到安全世界 恢复安全世界上下文 gt 在安全世界系统模式下 gt FIQ不清楚 进入Secure world中
  • 如何在 SublimeREPL 上运行 Python 代码

    我真的很喜欢使用 sublime text 2 编写 Python 代码 但是每当我尝试运行具有输入的脚本时 sublime text 控制台都会报告错误 所以 我决定尝试一下SublimeREPL 但是我已经搜索了几个小时 但没有找到如何
  • 将行样本与类标签相匹配

    我对下面的代码有一个小问题 最后一行是具体的 我试图找到我的 样本 的类名 我的意思是我需要知道哪个法线和哪个蓝精灵属于我的 1000x6 样本的每一行 sampling normIdx strmatch normal Book2 norm
  • 获取没有底部导航栏高度的屏幕尺寸

    所以flutter中的基本脚手架有appbar body和bottom bar 在我的底部导航栏中 我有 3 个项目 第 1 页 编辑器页面 第 2 页 贴纸 第3页 文字定制页面 每个页面都有自己的脚手架 编辑器页面有一个名为 Layou
  • 在 C# 中,字符串是引用类型,但为什么在另一种方法中操作它后它没有改变[重复]

    这个问题在这里已经有答案了 可能的重复 C 字符串引用类型 比如说 我有一个名为 string sample Initial value 传递给方法 test 之后 public static void Test string testSt
  • Xamarin 形成 MVVM Stacklayout 内容绑定

    我对 Xamarin 和 Xamarin 表单非常陌生 我需要一些帮助 我有一个 StackLayout 我想从 ViewModel 动态添加项目 问题是我似乎无法将 StackLayout 的内容绑定到 ViewModel 的 Stack
  • 单击 Facebook“赞”按钮获取用户电子邮件 ID?

    我想要用户点击 facebook Like 按钮时的电子邮件地址 这是我正在使用的代码 FB Event subscribe edge create function response like clicked 但响应只有 HREF 我该怎
  • Wordpress 和 Woocommerce 中的挂钩及其挂钩函数执行队列

    尽管我在其他网络平台和语言方面有经验 但我还是 WordPress WooCommerce 和 PHP 的新手 我已经搜索过 但没有找到我的问题的答案 由 add action 创建的挂钩是否 添加 到该特定挂钩调用的操作列表中 或者它们是
  • Java初始化和实例化的顺序

    我正在尝试将 JVM 中的初始化和实例化过程拼凑在一起 但 JLS 在一些细节上有点迟钝 因此如果有人介意清理一些细节 我们将不胜感激 这是我到目前为止所能弄清楚的 初始化 递归地初始化类的静态最终变量及其作为编译时常量的接口 按文本顺序退
  • 谷歌应用引擎;上传到 blobstore 出现 404 错误

    我正在使用 GAE 和 Python 2 7 制作一个网站 可以将带有 ascii 数据的文件上传到 blobstore 我为此使用的代码与本节下的教程中给出的代码几乎相同完整的示例应用程序 https developers google
  • 在浏览器中从网络摄像头获取 ReadableStream

    我想在浏览器中将网络摄像头输入作为 ReadableStream 传输到 WritableStream 我尝试过使用 MediaRecorder API 但该流被分成单独的 blob 而我想要一个连续的流 我认为解决方案可能是将 Media
  • 除非重复为 true,否则 UNCalendarNotificationTrigger 不会被存储

    我注意到如果我创建一个UNCalendarNotificationTrigger使用自定义日期 除非我输入 let trigger UNCalendarNotificationTrigger dateMatching components
  • 为什么在这种情况下我必须以某种方式关闭 ZipOutputStream?

    我有两个例子 示例1 try ByteArrayOutputStream baous new ByteArrayOutputStream FileOutputStream fouscrx new FileOutputStream new F
  • 使用 PHP GD 图像库着色和交换颜色?

    您好 我正在尝试使用 PHP 的 GD 图像库对图像进行着色和交换颜色 我正在使用位于此处的原始图像 http korlon com youknowbetter test jpg 并希望它达到橙色的脸 黑色的衣服和头发 就像你在这里看到的那
  • Autohotkey:发送 5 位十六进制 unicode 字符

    我一直在尝试找到一种方法来重新映射键盘并发送 5 位十六进制 unicode 字符 方法如下所述 ahk Send只支持 4 位十六进制代码 U nnnn 我知 道在过去 autohotkey 本身不支持 unicode 因此需要一些函数才
  • 查找用户是否正在通话?

    我想查看用户是否正在使用该应用程序以及他们是否正在打电话 我正在点击此链接来检查用户是否正在通话 iOS 如何检查当前是否正在通话 然而 这看起来像是针对 Objective C 的 我想知道是否有一个 Swift 等价的东西 这是我的尝试
  • ng-click 不适用于 ng-bind-html

    我有这样的 html 模板 scope template span class pointer i class icon refresh pointer i span 我想使用绑定这个模板ng bind html 我尝试使用它 也使用过ng
  • Django JQuery 自动完成

    我正在尝试向我的表单添加自动完成字段 但我无法去上班 我几乎尝试了所有教程 请求发送正常 我收到 200 响应 在开发人员工具窗格中 当我单击请求时 在 响应 选项卡上我会看到整个 HTML 文件 不应该有一个 json 格式的东西吗 这是
  • System.out.println 错误 新程序员

    我正在尝试执行一个简单的输入程序 但出现错误System out println命令 我不知道为什么它不接受该命令并且在我修复它之前无法继续工作 错误说 Multiple markers at this line Syntax error
  • Populate() 引用嵌套在对象数组中

    我正在尝试使用 Show 模型中的数据填充 我的 User 模型中的所有订阅 我尝试过 populate subscriptions show 但它对结果没有任何作用 如果我将订阅设为一个简单的参考数组 如下所示 subscriptions