我在数据库中保存了一个集合,我想使用 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 。
答案 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 ] }
]
}
}
}
])