database - 聚合以过滤 MongoDB 中的引用

标签 database mongodb mongoose aggregate nosql-aggregation

我正在尝试与 Mongoose 进行聚合工作,但我遇到了问题,我得到了这个结果:

[
   {
     _id: new ObjectId("630bb658370cc689973c5bb4"),
     isRead: true,
     user: new ObjectId("630273bbe0f3f82d85b149bd"),
     globalRef: new ObjectId("630bb649370cc689973c5b62"),
   },
   {
     _id: new ObjectId("630bb649370cc689973c5b62"),
     isRead: false,
   },
   {
     _id: new ObjectId("6306bcf16fa60080148fefb6"),
     isRead: false,
   },
   {
     _id: new ObjectId("630273bbe0f3f82d85b149bd"),
     isRead: false,
     user: new ObjectId("630273bbe0f3f82d85b149bd")
   },
   {
     _id: new ObjectId("6306bcf16fa60080148fefb7"),
     isRead: true,
     user: new ObjectId("630273bbe0f3f82d85b149bd")
   }
]

我们可以看到第一个元素对第二个元素有一个引用 (globalRef),

如果存在另一个元素并以后者作为引用,我想删除元素,这可以通过 $match 实现吗? $组? $项目? $过滤器?

期望的结果:

[
   {
     _id: new ObjectId("630bb658370cc689973c5bb4"),
     isRead: true,
     user: new ObjectId("630273bbe0f3f82d85b149bd"),
     globalRef: new ObjectId("630bb649370cc689973c5b62"),
   },
   {
     _id: new ObjectId("6306bcf16fa60080148fefb6"),
     isRead: false,
   },
   {
     _id: new ObjectId("630273bbe0f3f82d85b149bd"),
     isRead: false,
     user: new ObjectId("630273bbe0f3f82d85b149bd")
   },
   {
     _id: new ObjectId("6306bcf16fa60080148fefb7"),
     isRead: true,
     user: new ObjectId("630273bbe0f3f82d85b149bd")
   }
]

感谢您的帮助

最佳答案

查询

  • 您可以使用 globalRef 进行自查找 _id(使 globalRef 上的索引更快)
  • 加入后,如果结果为空(未找到匹配项),则保留文档
  • 取消设置以删除结果字段

Playmongo

coll.aggregate(
[{"$lookup": 
   {"from": "coll",
    "localField": "_id",
    "foreignField": "globalRef",
    "as": "results"}},
 {"$match": {"$expr": {"$eq": ["$results", []]}}},
 {"$unset": ["results"]}])

关于database - 聚合以过滤 MongoDB 中的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73522687/

相关文章:

javascript - MongoDB $geoNear 距离返回值精度下降

node.js - ClientSession 无法序列化为 BSON

node.js - Mongoose:错误找不到模块调试

java - 在Web应用程序中同时访问数据库

sql - 大容量数据库

php - 函数 : Database connection in function or pass it as argument? 的最佳情况是什么

java - MongoDB 统计计数与文档数量不同

mongodb - Mongoose/Mongo 在 objectId 数组中查找

javascript - findByIdAndRemove 导致错误

javascript - 使用 jQuery 动态填写表单值