将数据从一个模型分成两个后,如何重写我的猫鼬查询?

2023-12-13

在我的应用程序中,我存储评论。以前我的模型是这样的:

var CommentsSchema = new Schema({
    username: {type: String},
    display_name: {type: String},
    facebook_username: {type: String},
    text_content: {type: String},
    photo_content_url: {type: String},
    hashtags: {type: [String]},
    device_id: {type: String},
    comment_date: {type: Date, default: Date.now},
    friends_only: {type: Boolean, default: false}
}

每条评论 - 除了存储其详细信息 - 还包含有关作者的详细信息,例如username, facebook_username, device_id从中添加了评论并且display_name。还有一个布尔标志friends_only基于此,我决定该评论是否应该仅对用户的 Facebook 好友或所有人可见。

建设node.js/mongoose获取所有评论的查询如下所示:

commentsRoutes.post('/friends', function (req, res) {
    var friends = req.body.friends;
    var publicComments = req.body.publicComments;

    var hashtagsInput = req.body.hashtags;

    var startDate = req.body.startDate;
    var endDate = req.body.endDate;

    var query= {};
    query.$and = [];

    // and condition on start date
    if(startDate != undefined) {
        var startDate = new Date(req.param('startDate'));
        var endDate = new Date(req.param('endDate'));
        query.$and.push({"comment_date":{$gte: startDate}});
        query.$and.push({"comment_date":{$lte: endDate}});
    }

    // and condition on hastags
    if (hashtagsInput != undefined) {
        var hashtags = hashtagsInput.split(",");
        query.$and.push({"hashtags":{$in: hashtags}});
    }

    // creating a OR condition for facebook friends and public flag
    var friend_query = {};
    friend_query.$or = [];

    if (friends != undefined) {
        var friendsSplit = friends.split(",");
        friend_query.$or.push({"facebook_username":{$in: friendsSplit}});
    }

    if (publicComments != undefined && publicComments === "true") {
        friend_query.$or.push({friends_only: false});
    }

    //Merging facebook friend condition with other condition with AND operator.
    query.$and.push(friend_query);

    var finalQuery = Comment.find(query)

使用上面的代码,用户可以获取他的朋友发布的内容(设置为公共或私人)以及所有其他公共内容(来自其他人)。

我决定改变这一切,并将数据分成两个模型。更改后我有:

var CommentsSchema = new Schema({
    user_id: {type: String, required: true, ref: 'users' },
    text_content: {type: String},
    photo_content_url: {type: String},
    hashtags: {type: [String]},
    comment_date: {type: Date, default: Date.now},
    friends_only: {type: Boolean, default: false},
    device_id: {type: String}
}

and

var UsersSchema = new Schema({
    username: {type: String},
    facebook_username: {type: String},
    display_name: {type: String}
}

现在,当我想保留旧功能时,我需要修改负责创建查询的代码。 我可以合并两个查询async,或者另一种方法是使用mongoose .populate选项。我决定选择第二个选择,所以现在我需要移动负责创建的代码or查询到match部分populate功能:

...
var finalQuery = Comment.find(query)

finalQuery.populate({path: 'user_id', 
    select: 'facebook_username display_name username',
    match: {

}});

我不知道该怎么做。你能帮我吗?


首先,我建议您使用填充查询,如果您觉得填充不会为您提供所需的数据,您可以运行两个查询并合并这些结果。

对于填充,我从猫鼬的官方文档中找到了解决方案。你可以这样做。

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

var personSchema = Schema({
  _id     : Number,
  name    : String,
  age     : Number,
  stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});

var storySchema = Schema({
  _creator : { type: Number, ref: 'Person' },
  title    : String,
  fans     : [{ type: Number, ref: 'Person' }]
});

var Story  = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);

Story
.findOne({ title: 'Once upon a timex.' })
.populate('_creator')
.exec(function (err, story) {
  if (err) return handleError(err);
  console.log('The creator is %s', story._creator.name);
  // prints "The creator is Aaron"
});

这是文档链接:http://mongoosejs.com/docs/populate.html

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

将数据从一个模型分成两个后,如何重写我的猫鼬查询? 的相关文章

随机推荐

  • LSF 中的混合 MPI/OpenMP

    我正在将 OpenMP 并行化的程序移至集群 该集群使用 Lava 1 0 作为调度程序 每个节点有 8 个核心 我在作业脚本中使用 MPI 包装器来进行多主机并行 这是作业脚本 BSUB q queue name BSUB x BSUB
  • fopen(file,w+) 会先截断文件,然后才能检查文件是否已被算法lock()锁定

    我有一个函数 它接收文件名和 json 对象以写入文本文件 该对象已更新 需要完全替换文件的当前内容 每个站点访问者都有自己的文件 多次快速更改会造成文件被截断的情况fopen file w 然后不会被写入 因为它已被锁定 最终结果是空文件
  • 如何使用 doxygen 从 C++ 源代码创建 UML 类图

    我一直在寻找一些描述如何使用 doxygen 生成简单类图的材料 但找不到 有人可以帮忙吗 I need to create diagrams as shown below from a set of C files 如果有更好的工具可以更
  • 如何在 Spark 中创建一组 ngram?

    我使用 Scala 从 Spark 2 2 数据帧列中提取 Ngram 因此 本例中为三元组 val ngram new NGram setN 3 setInputCol incol setOutputCol outcol 如何创建包含全部
  • 使用基于 sed/awk 的 Linux 中替换字符串

    我想更换这个 usr bin env bash 有了这个 bin bash 我尝试了两种方法 方法一 original str usr bin env bash replace str bin bash sed s original str
  • 在简单的多层 FFNN 中,只有 ReLU 激活函数不收敛

    我正在学习张量流 深度学习并尝试各种激活函数 我为 MNIST 问题创建了一个多层 FFNN 大部分基于tensorflow官方网站的教程 只是添加了3个隐藏层 我实验过的激活函数有 tf sigmoid tf nn tanh tf nn
  • 如何使用 android volley 库将位图图像上传到服务器?

    如何使用 android volley 库将位图图像上传到服务器 我正在尝试使用 android volley 将图像上传到服务器 如果 android volley 中没有这样的选项 您能否建议我使网络操作更快的最佳方法 欢迎您向我发送与
  • DefaultTreeModel 和 Wicket Tree:setAsksAllowsChildren 不起作用

    I m using Wicket s Tree component in a web app But empty folders are shown in a file way Just like this 下面是我使用 DefaultTr
  • 为什么不在中断内使用互斥体

    我已经通过了这个帖子我注意到在克利福德的回答中他说我们不应该在中断中使用互斥体 我知道在中断中我们必须避免太多的指令和延迟分机 但我不太清楚原因有人可以澄清吗我出于什么原因必须避免这种情况 如果我们想要在两个中断驱动线程之间建立同步通信 如
  • Perl if 块中的“-s”有什么作用?

    我有这样的代码块 if s fh more code 我只需要知道 s 是什么意思 s fh检查文件大小 fh so s fh测试文件大小的长度是否为零 或者不存在这样的文件 fh可以是文件名或文件句柄 检查perldoc f X 请注意
  • 将列表中的所有数据框保存到单独的 .csv 文件中

    我有一个数据框列表 我想将其保存到独立的 csv 文件中 目前我为每个数据框都有一个新行 write csv lst df1 C Users df1 write csv lst df2 C Users df2 ad nauseam 显然这并
  • 竹子:如何制作maven神器

    我已经设置了一个 Bamboo 服务器并使用 Maven 构建任务制作了一个测试项目和计划 但这个任务不会产生任何工件 也许除了测试结果 我没有检查过 我希望将所有 Maven 工件附加到构建结果中 就像在 Hudson 中所做的那样 怎么
  • Dataclip 错误 ERROR:无法在只读事务中执行 INSERT [重复]

    这个问题在这里已经有答案了 我想在 Heroku 中插入数据 但我无法执行此操作 因为它的错误是 Dataclip Error ERROR cannot execute INSERT in a read only transaction 赫
  • 如何为每一行将日期时间列增加一秒?

    假设我有这个时间值 09 00 00 我有一个包含 时间 列的表 其中有三个记录 我想用那个时间更新这 3 条记录 但时间值每次增加一秒 对于每条记录 像这样的东西 ColumnA ColumnB 1 09 00 00 2 09 00 01
  • 在 async.series 中调用 async.series 会产生不可预测的输出

    使用 caolan 的 Node js 异步库 我一直在尝试调用一个使用async series在另一个使用 async series 的函数内 但我仍然无法让函数以正确的顺序运行 如下所示 终端输出显示第二个函数在第一个函数之前被调用 没
  • 从广播接收器关闭应用程序

    我是 Android 编程新手 我尝试在活动中注册广播接收器 但当应用程序暂停时我的接收器无法工作 所以我发现我需要在清单中注册我的接收器 我的目标是在用户关闭 Wifi 后关闭我的应用程序一段时间 这是我的代码 但它不起作用 public
  • 使用 Java 5 运行 JAXB 编组异常 javax.xml.stream.FactoryConfigurationError

    我正在 JUnit 测试类中尝试简单的 JAXB 封送处理 并且使用的是 Java 5 运行测试时出现此错误 javax xml stream FactoryConfigurationError 未找到提供程序 com bea xml st
  • 如何将 2 个 wav 文件混合在一起?

    我正在尝试录制输入并将其与歌曲合并在一起 不是连接 我有一把在听歌曲时录制的吉他 我想将吉他放在歌曲中 如 audcaity 有什么办法可以做到吗 如果无法进行实时混音 是否可以在录制后合并它们 就像我录制吉他后 现在它是一个 wav 文件
  • Java Unsafe.copyMemory java.lang.IllegalArgumentException

    我对来自 Unsafe 的 copyMemory 有疑问 我花了2天的时间来解决它 但没有结果 下面提供的代码始终以 IllegalArgumentException 结束 你能帮我看看问题出在哪里吗 public void testMem
  • 将数据从一个模型分成两个后,如何重写我的猫鼬查询?

    在我的应用程序中 我存储评论 以前我的模型是这样的 var CommentsSchema new Schema username type String display name type String facebook username