mongodb - 如何将 Collection.find() 转换为具有多个匹配值的 Collection.aggregate()?
问题描述
我需要将 Collection.find(demandObject) 查询切换到 Collection.aggregate() 函数,但无法正确组合。
我的收藏:
"movies": [
{
"_id": "5e34800b13ad37006c550182",
"name": "Matrix",
"genres": [
"5e2d8a3e503465004beeeb4d",
"5e2d8a3e503465004beeeb4e",
"5e2d8a3e503465004beeeb55"
],
"themes": [
"5e2ddd90783eeb0102da66cd"
]
},
{
"_id": "5e34800b13ad37006c550182",
"name": "Matrix 2",
"genres": [
"5e2d8a3e503465004beeeb4f",
"5e2d8a3e503465004beeeb44",
"5e2d8a3e503465004beeeb56"
],
"themes": [
"5e2ddd90783eeb0102da66c7"
]
},
]
我有以下查询:
Collection.find({
"genres": {
"$all": [
"5e2d8a3e503465004beeeb4e",
"5e2d8a3e503465004beeeb4a"
]
},
"themes": {
"$all": "5e2ddd90783eeb0102da66be"
},
"name": {
"$regex": "Matrix",
"$options": "i"
}
});
我的方法
Collection.aggregate([
{ "$match":
{
"$and": [
{"name": { "$regex": "Matrix", "$options": "i" }},
{"themes": { "$all": ["5e2ddd90783eeb0102da66be"] }},
{"genres": { "$all": ["5e2d8a3e503465004beeeb4e", "5e2d8a3e503465004beeeb4a"] }}
]
}
}
]).exec();
find 方法返回我想要的集合,但聚合方法响应始终为空。我究竟做错了什么?
解决方案
同时我找到了解决方案。
首先@prasad_ 是对的,查询与 .find 方法中的查询完全相同。在聚合方法中,查询对接受的值更严格一些。
我试图匹配 ObjectId,但聚合方法不明白这些字符串是 ObjectId,所以你必须先转换它们
new mongoose.Types.ObjectId("5e2ddd90783eeb0102da66be")
并且查询在没有 $and 的情况下工作
Game.aggregate([
{ "$match": {
"genres": {
"$all": [
"5e2d8a3e503465004beeeb4e",
"5e2d8a3e503465004beeeb4a"
]
},
"themes": {
"$all": "5e2ddd90783eeb0102da66be"
},
"name": {
"$regex": "Matrix",
"$options": "i"
}
}}
]);
我找到了一个相关的答案 Can't use $match with mongoose and the aggregation framework
推荐阅读
- python - 在 Python 中为列表赋值并转换数据
- scala - 返回指定类型的通用 Traversable
- elasticsearch - 如何过滤来自复合聚合的结果?
- database - 我可以通过 DropBox 共享文件夹测试 Solr 吗?
- c# - 合并多个可观察对象并更新现有订阅者?
- bash - 来自 tee 命令的意外或空输出
- abap - SAP ERP 和 SAP CRM 之间添加项目的数据传输
- javascript - 如何在第一个广告位被渲染后动态添加超过 1 个 DFP 广告位?
- firebase - 如何在 Firebase Cloud Firestore 中获取部分字符串查询匹配?
- html - 如何连续对齐 3 个分区,以使最后一个元素位于页面的中间?