如何在 Robo3T 中将结果从一个查询传递到另一个查询

How to pass results from one query to another in Robo3T

我试图将一个 MongoDB 查询的结果传递给另一个查询,但结果在对象中,我需要它作为数组。 示例:

var locId = db.getCollection('locations').find({country:"France"}, {_id:1}).toArray()

如何将结果传递给另一个查询:

db.getCollection('products').find({locId: {$in: locId }})

第一个查询的结果类似于:

array[1] [
obj[0] {_id: LocId123},
obj[1] {_id: LocId456},
obj[1] {_id: LocId789},
]

我可以用这个传递值:

locId = Array.from(locId , value => value._id )

问题是我无法将其封装在外部函数中,因为我无法通过函数参数传递此“_id”。 关于如何自动化它有什么想法吗?

您可以使用aggregate()将所有id组合成一个数组,

  • $matchcountry条件
  • $group by null 表示 none 并将 _id 推入数组 ids
  • $project 显示 _ids 并隐藏 _id
var locId = db.getCollection('locations').aggregate([
  { $match: { country: "france" } },
  {
    $group: {
      _id: null,
      ids: { $push: "$_id" }
    }
  },
  {
    $project: { _id: 0, ids: 1 }
  }
])

游乐场:https://mongoplayground.net/p/8_uzjCNMy00

结果:

[{
    "ids": [1, 2, 3]
}]

您可以访问:

db.getCollection('products').find({locId: {$in: locId[0]['ids'] }})


如果你想在单个聚合查询中组合这两个查询,那么试试,

  • $matchcountry条件
  • $lookup 使用 localField 加入 products 集合 _id 到 foreignField locId
  • $unwind解构products数组
  • $group by _id null 并推送 products
  • 中的所有产品
  • $unwind解构products数组
  • $project 显示必填字段
var products = db.getCollection('locations').aggregate([
  {
    $match: { country: "france" }
  },
  {
    $lookup: {
      from: "products",
      as: "products",
      localField: "_id",
      foreignField: "locId"
    }
  },
  { $unwind: "$products" },
  {
    $group: {
      _id: null,
      products: { $push: "$products" }
    }
  },
  { $unwind: "$products" },
  {
    $project: {
      _id: "$products._id",
      locId: "$products.locId"
    }
  }
])

游乐场:https://mongoplayground.net/p/xOnohm0OWBV