mongoose 如何向数组发出正确的聚合请求以排除空响应

2vuwiymt  于 2023-01-21  发布在  Go
关注(0)|答案(1)|浏览(80)

存在以下类型的数据库:{_id: "...", shelf:{type:String}, books:{type:Array({ name :{type:String}})}}无论如何我都需要提取所有书架,即使它们没有我正在寻找的书,我的不成功查询如下所示:

let query = [ 
 {$match:{shelf: shelf}},
 {$unwind: "$books"}, 
 {$match: {$or:[ {'books.name ': {$exists: false}}, // If empty 
 {'books.name ': name}, // If there is a necessary book 
 {'books.name ': {$nin:name}} // If there is no necessary 
]}} ]

我想排除一个空答案的愿望使我走进了死胡同。有人尝试使用$not, $ne, $nin。结果是一个[ ] or undefined

jrcvhitl

jrcvhitl1#

我相信你正在尝试获取书架而不管书是否存在。你的查询有$unwind,它正在停止这个操作,你需要传递一个额外的参数(preserveNullAndEmptyArrays),如下所示

let query = [{
    $match: {
      shelf: shelf
    }
  },
  {
    $unwind: {
      path: "$books",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $match: {
      $or: [{
          'books.name ': {
            $exists: false
          }
        }, // If empty 
        {
          'books.name ': name
        }, // If there is a necessary book 
        {
          'books.name ': {
            $nin: name
          }
        } // If there is no necessary 
      ]
    }
  }
]

相关问题