mongodb - Mongodb 不在查询中,因为具有来自同一集合的两个文档子集

标签 mongodb mongodb-query aggregation-framework

我是 mongodb 新手。假设如下。一个集合 x、y 和 z 中有 3 种类型的文档。

docs = [{
  "item_id": 1
  "type": "x"
},
{
  "item_id": 2
  "type": "x"
},{
  "item_id": 3
  "type": "y",
  "relavent_item_ids": [1, 2]
},
{
  "item_id": 3
  "type": "y",
  "relavent_item_ids": [1, 2, 3]
},{
  "item_id": 4
  "type": "z",     
}]

我想要得到以下内容。

  • 忽略类型为 z 的文档
  • 获取 x 类型的所有文档它在哪里item_id不在 relavent_item_ids 中类型 y文件。
  • 结果应为 item_id领域。

我尝试做 match $in但这会返回所有记录,我无法弄清楚如何处理 y 类型的文档子集.

最佳答案

您可以使用以下查询

const item_ids = (await db.collection.find({ "type": "y" })).map(({ relavent_item_ids }) => relavent_item_ids)

const result = db.collection.find({
  "item_id": { "$exists": true },
  "type": { "$ne": "z", "$eq": "x" },
  "relavent_item_ids": { "$nin": item_ids }
})

console.log({ result })

忽略类型为 z 的文档 --> 使用 $ne不等于查询运算符来过滤 z 类型。

获取 x 类型的所有文档,其中 item_id 不在 y 类型文档的 relavent_item_ids 中 --> 使用 $expr匹配相同的文档字段。

结果应该有 item_id 字段 --> 使用 $exists查询运算符。

关于mongodb - Mongodb 不在查询中,因为具有来自同一集合的两个文档子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59526214/

相关文章:

javascript - 如何使用单个批处理文件或 javascript 导入或导出多个 mongo 集合

c# - 使用 BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId 在 C# 中装饰属性的区别

node.js - 每天或每月间隔的交易总和

linux - 无法连接到服务器 127.0.0.1 shell/mongo.js

node.js - 你能从 mongo 访问 mongoose 创建的数据库吗?

mongodb - fork 聚合管道

python - 如何检查 pymongo 游标是否有查询结果

mongodb - 使用聚合框架使用 MongoDB 进行组计数

mongodb - 随时间分桶分析的范围支持

javascript - MongoDB MapReduce 显示 "[object Object]"作为键,尽管针对它们进行了类型检查