如何查询不同的集合(没有关系)?

时间:2020-10-26 07:29:42

标签: mongodb

我正在尝试提高查询执行的性能。 MongoDB包含三个(或更多)具有相同结构的文档的集合。像这样的东西:

db.france.insertMany([
    {field1: 11, field2: 12, field3: 13},
    {field1: 21, field2: 22, field3: 23},
    {field1: 31, field2: 32, field3: 33}
])

db.germany.insertMany([
    {field1: 11, field2: 12, field3: 13},
    {field1: 21, field2: 22, field3: 23},
    {field1: 31, field2: 32, field3: 33}
])

db.belgium.insertMany([
    {field1: 11, field2: 12, field3: 13},
    {field1: 21, field2: 22, field3: 23},
    {field1: 31, field2: 32, field3: 33}
]) 

从两个大学英语“ france”和“德国”获得类似结果的查询(一个查询)应该是什么:

[
    {field1: 21, field2: 22, field3: 23},
    {field1: 21, field2: 22, field3: 23}    
] 

非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试

  • $match,如果您要搜索特定的文档字段
  • $group为空,并准备法国文档数组
  • $lookup到gernamny集合并获取所有文档
  • $project使用$concatArrays
  • 在根目录同时合并两个数组
  • $unwind解构根数组
  • $replaceWith替换root中的根对象
db.france.aggregate([
  // { $match: { field1: 21 } } // optional
  {
    $group: {
      _id: null,
      france: { $push: "$$ROOT" }
    }
  },
  {
    $lookup: {
      from: "germany",
      pipeline: [
        // { $match: { field1: 21 } } // optional
      ],
      as: "germany"
    }
  },
  {
    $project: {
      root: {
        $concatArrays: ["$france", "$germany"]
      }
    }
  },
  { $unwind: "$root" },
  { $replaceWith: "$root" }
])

Playground

注意:如果两个集合中都有数百万条记录,那么我不建议您使用此查询,这可能是因为该查询的速度和效率很高,您需要更改架构设计,或者可以执行2个查询并结合两个结果。

答案 1 :(得分:0)

恐怕对此没有直接解决方案。您将必须手动合并服务器中的两个文档。

但是在这种情况下,我想说的更多是模式设计问题。在这种情况下,我建议您将所有文档存储在一个集合中。然后只需添加一个country字段。

然后,您可以使用以下查询轻松查询文档:

Coll.find({ country: { $in: ["france", "germany"], field1: 21, field2: 22, field3:23 })