微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MongoDB - 找出两个集合之间的差异

如何解决MongoDB - 找出两个集合之间的差异

我有两个集合:

用户

var UserSchema = new mongoose.Schema({
    likes: [{ type: mongoose.Schema.Types.ObjectId,ref: 'Products' }],dislikes: [{ type: mongoose.Schema.Types.ObjectId,})

产品

var ProductSchema = new mongoose.Schema({
  title: {
    type: String,required: true,},})

我想退回不在 User.likes 或 User.dislikes 中的所有产品。这是我目前的做法:

const user = await User.findById(req.user.id,'likes dislikes');
let seenProducts = [];

user.likes.forEach(p => {
    seenProducts.push(new mongoose.Types.ObjectId(p));
})

user.dislikes.forEach(p=> {
    seenProducts.push(new mongoose.Types.ObjectId(p));
})

Product.aggregate([
    {
        $match: { _id: { $nin: seenProducts } },}
])

它有效,但如果可能,我想切换到使用聚合管道框架来执行此操作。比较两个系列似乎并不容易......我已经尝试了一段时间但没有运气。 $setUnion$setDifference 看起来很有希望,但我找不到一种方法来设置用户喜欢和不喜欢的联合,然后是所有产品的差异。

解决方法

db.user.aggregate([{
  $lookup: {
    from: "product",pipeline: [{
      $match: {
        $or: [{
          likes: {
            $in: [ < ids or whatever > ]
          }
        },{
          dislikes: {
            $in: [ < ids or whatever > ]
          }
        }]
      }
    }],as: "nameofthevariable"
  }
}])

基本上编写一个查找作为左外连接从产品集合中获取值,其中喜欢是或不喜欢是。在这种情况下,$in 允许您根据要求输入多个值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。