$ eq无法使用$ unwind结果mongoose

时间:2017-06-06 13:38:48

标签: node.js mongodb mongoose aggregation-framework

我有简单的架构,其中Events.like存储用户的objectId。我想匹配数组中的特定用户(Events.like)并根据匹配添加标记isLiked。

   Events.aggregate([
    { $unwind: '$like'},
      {
          "$project":{
            //   "count" : {$size: "$like"},
            "like":1,
          "isLiked" :{ "$eq": [ "like", "593564b94642650d5b09f16b"  ] },
            //   "isLiked" : { "$cond": [{ "$eq": [ "like", "593564b94642650d5b09f16b" ] }, true, false ] } }
            }
        }
    ], function(err, list) { }

这种方法总是给我假。看结果

 "data": [
    {
      "_id": "593647ae9e10082982d3f7a2",
      "like": "593563f66d2e9f0b84553fc3",
      "isLiked": false
    },
    {
      "_id": "593643a5a1e73a2841d3cddb",
      "like": "593564b94642650d5b09f16b",
      "isLiked": false
    },
    {
      "_id": "593643a5a1e73a2841d3cddb",
      "like": "593563f66d2e9f0b84553fc3",
      "isLiked": false
    }
  ]

任何人都可以告诉我我在哪里错误

########## update ##########

{ $unwind: '$like'},
    {
          "$project":{
          "isLiked" :{ "$eq": [ "$like", mongoose.Types.ObjectId("593564b94642650d5b09f16b")  ] },
        }
    },
    {
        $group: {
          _id: '$_id',
          'likes': { $sum: 1},
          "like": { $push: '$like' },
          "isLiked" : 1
      }
    }

然后   MongoError:必须将组聚合字段'isLiked'定义为对象内的表达

我想简单地想要下面的结果

 "data": [
    {
      "_id": "593647ae9e10082982d3f7a2",
      "like": ["593563f66d2e9f0b84553fc3","593643a5a1e73a2841d3cddb" ],
      "likes":2
      "isLiked": true
    },
    {
      "_id": "593643a5a1e73a2841d3cddb",
      "like": "[593563f66d2e9f0b84553fc3"],
      "likes":1,
      "isLiked": false
    }
  ]

1 个答案:

答案 0 :(得分:1)

您传递的用户ID正在作为字符串传递,您需要将其转换为objectId。试试这个

编辑:提问者指出的字段的固定路径,@ ShivShanker

Events.aggregate([
{ $unwind: '$like'},
  {
      "$project":{
        //   "count" : {$size: "$like"},
        "like":1,
      "isLiked" :{ "$eq": [ "$like", mongoose.Types.ObjectId("593564b94642650d5b09f16b")  ] }
        }
    }
], function(err, list) { }