代码之家  ›  专栏  ›  技术社区  ›  D. Rattansingh

检索数组中不等于ObjectID的排序值

  •  0
  • D. Rattansingh  · 技术社区  · 2 年前

    这是我的电影数据库架构:

    enter image description here

    我有这个代码,它检索 title reviews 按创建日期降序排列的对象数组(工作):

    db.films.findOne({ _id: ObjectId('64d69473da87c0c91ae7c596') }, 
         {title:1, reviews:{$sortArray:{input:"$reviews", sortBy:{creationdate:-1}}} } )
    

    我试图扩展这一点,发现所有带有该元素的评论都不等于特定的 userid :

    db.films.findOne(
          { _id: ObjectId("64d69473da87c0c91ae7c596") },
          {
            title: 1,
            updatedreviews: {
              $sortArray: {
                input: [
                  {
                    $cond: [
                      {
                        $not: {
                          $in: [
                            ObjectId("64d95f9b4ce0a13e8fc37567"),
                            "$reviews.userid",
                          ],
                        },
                      },
                      "$reviews",
                      null,
                    ],
                  },
                ],
                sortBy: { "$reviews.creationdate": -1 },
              },
            },
          }
        );
    

    它不起作用:它正在检索 null .我试了相反的方法,等于 $in 具体 userid 但它正在返回所有评论:

    db.films.findOne(
          { _id: ObjectId("64d69473da87c0c91ae7c596") },
          {
            title: 1,
            updatedreviews: {
              $sortArray: {
                input: [
                  {
                    $cond: [
                      {
                          $in: [
                            ObjectId("64d95f9b4ce0a13e8fc37567"),
                            "$reviews.userid",
                          ],
                      },
                      "$reviews",
                      null,
                    ],
                  },
                ],
                sortBy: { "$reviews.creationdate": -1 },
              },
            },
          }
    );
    

    关于如何解决这个问题并检索所有非该特定用户的评论的任何想法 ObjectId ?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Yong Shun    2 年前

    您应该使用 $filter 运算符来筛选中的匹配元素 reviews 大堆

    db.films.findOne({
      _id: ObjectId("64d69473da87c0c91ae7c596")
    },
    {
      title: 1,
      updatedreviews: {
        $sortArray: {
          input: {
            $filter: {
              input: "$reviews",
              cond: {
                $ne: [
                  ObjectId("64d95f9b4ce0a13e8fc37567"),
                  "$$this.userid"
                ]
              }
            }
          },
          sortBy: {
            "creationdate": -1
          }
        }
      }
    })
    

    Demo @ Mongo Playground