猫鼬如何将对象的属性“ _id”与另一个对象中数组的所有结果匹配

时间:2019-03-18 09:22:43

标签: mongodb mongoose

我正在使用猫鼬在NodeJS中制作API,并且我必须建立需要关联的模型:

const userSchema = new Schema({{...}

  favs: [{
    type: Schema.Types.ObjectId,
    ref: 'Propuesta'
  }]
}, {...}
})

和一个名为“ Propuesta”的对象,该对象具有自己的ID

我需要的是在控制器中,使用$ match运算符获取包含在数组'favs'中的Propuesta模型的所有ID,然后使用$ group获得重复次数最多的Partido(这是另一个型号,并且此功能可以正常运行)。

很显然,'favs'是一个动态增长的数组,因此对于我所看到的,我需要在$ match代码中使用运算符$ or,但是我不知道如何将语法编写为说“如果此ID等于favs [0],或favs [1]或favs [n]”

这是我现在的方法(我知道现在正在比较我的id是否等于整个字符串“ [id:{...},id:{...} ...]”

export const partidoAfin = ({ user, querymen: { query, select, cursor } }, res, next) => {


  Propuesta
  .aggregate([
    {
      '$match': {
         $or: {'_id': user.favs}
      }
    },
      {'$group': {
            '_id': '$partido',
            'partidoCount': {'$sum': 1}
          }},
          {'$sort': {partidoCount: -1}}
        ])
        .then(success(res))
        .catch(next)
}

非常感谢您

1 个答案:

答案 0 :(得分:0)

我通过以下操作对其进行了修复:

export const partidoAfin = ({ user, querymen: { query } }, res, next) => {

  let arrayIds = []
  arrayIds = user.favs

    Propuesta
    .aggregate([
      {
        '$match': {
           '_id': {'$in': arrayIds}
        }
      },
        {'$group': {
              '_id': '$partido',
              'partidoCount': {'$sum': 1}
            }},
            {'$sort': {partidoCount: -1}}
          ]).then((result) => ({
            count: result.length,
            rows: result
          }))
          .then(success(res))
          .catch(next)
}