使用nodejs在mongo中过滤对象子项

时间:2019-03-25 19:22:32

标签: node.js mongodb

我在数据库中保存了一个集合,我想使用 companyId 相机使用特定于 ObjectId 的集合对其进行过滤。

下面是想要获取的集合。

  {
        "_id": ObjectID("5c3b584fa7e1b10155e6325f"),
        "companyId": "5c3b5468a7e1b10155e9995b",
        "name": "Place Test",
        "cameras": {
            "0": ObjectID("5c9149e3f054d00028cc9604"),
            "1": ObjectID("5c9149e3f054d00028cc9605")
        }
    }

我正在尝试像这样进行过滤:

  const placeCollection = req.app.locals.db.collection('places')
        const place = placeCollection.findOne({
          companyId: req.body.companyId,
          cameras: { $elemMatch: { $eq: new ObjectId(req.body.cameraId) } }
        })

但不能使用相机过滤器,而只能使用 companyId

1 个答案:

答案 0 :(得分:2)

由于cameras中的键是动态生成的,因此您需要$objectToArray运算符来检查是否有任何值等于req.body.cameraId。您可以在此处利用$anyElementTrue运算符:

db.col.aggregate([
    {
        $match: {
            $expr: {
                $and: [
                    {
                        $anyElementTrue: {
                            $map: {
                                input: { $objectToArray: "$cameras" },
                                in: { $eq: [ "$$this.v", new ObjectId(req.body.cameraId) ] }
                            }
                        }
                    },
                    { $eq: [ "$companyId", req.body.companyId ] }
                ]
            }
        }
    }
])

Mongo playground