Mongodb 给定一个对象数组,如何根据数组的每个匹配项过滤数据库中现有对象的结果?

Mongodb 给定一个对象数组,如何根据数组的每个匹配项过滤数据库中现有对象的结果?,mongodb,Mongodb,我有一个结构如下的集合: { "toystore": 22, "toystore_name": "Toystore A", "toys": [ { "toy": "buzz", "code": 17001, "price": 500 }, { "toy": "woddy", "code": 17002, "price": 1000

我有一个结构如下的集合:

 {
    "toystore": 22,
    "toystore_name": "Toystore A",
    "toys": [
      {
        "toy": "buzz",
        "code": 17001,
        "price": 500
      },
      {
        "toy": "woddy",
        "code": 17002,
        "price": 1000
      },
      {
        "toy": "pope",
        "code": 17003,
        "price": 300
      }
    ]
  },
  {
    "toystore": 11,
    "toystore_name": "Toystore B",
    "toys": [
      {
        "toy": "jessie",
        "code": 17005,
        "price": 500
      },
      {
        "toy": "rex",
        "code": 17006,
        "price": 2000
      }
    ]
  }
]
我有
n
玩具店,在每个玩具店中,我在
toys
字段(是一个数组)中有该店提供的玩具

可能有重复的代码,我想搜索

[ { "toys.code": 17001 }, { "toys.code": 17003 }, { "toys.code": 17005 }, { "toys.code": 17005 }]
我希望每个
玩具都能生成结果。code
无论它们是否重复,当前结果都不会重复(例如使用code
17005

这是我当前的输出:

[
      {
        "_id": "Toystore A",
        "toy_array": [
          {
            "price_original": 500,
            "toy": "buzz"
          },
          {
            "price_original": 300,
            "toy": "pope"
          }
        ]
      },
      {
        "_id": "Toystore B",
        "toy_array": [
         //**********
          //as i searched 2 times the code:17005, this object should be shown 2 times. only is showed 1 time. 
          {
            "price_original": 500,
            "toy": "jessie"
          }
        ]
      }
    ]
如何获得数组中每个匹配项的返回结果

这是我的现场代码:

db.collection.aggregate([
      {
        $unwind: "$toys"
      },
      {
        $match: {
          $or: [
            {
              "toys.code": 17001
            },
            {
              "toys.code": 17003
            },
            {
              "toys.code": 17005
            },
            {
              "toys.code": 17005
            }
          ],

        }
      },
      {
        $group: {
          _id: "$toystore_name",
          toy_array: {
            $push: {
              price_original: "$toys.price",
              toy: "$toys.toy"
            },

          },

        },

      },

    ])

阶段,
$match
检查管道中的每个文档并评估提供的标准,或者删除文档,或者将其传递到下一阶段。它不会迭代匹配条件并检查每个文档的整个文档流,这是复制两次引用的文档所需要的

这是可以做到的,但是您需要在管道中传递两次代码数组,一次是为了消除根本不匹配的文档,另一次是为了允许您正在寻找的重复

所需的阶段是:

  • $match消除没有任何所需玩具的玩具店
  • $project使用
    o$map以迭代搜索数组
    o$filter用于选择匹配的玩具
    o$reduce以消除空数组,并将条目重新组合到单个数组中
  • 另外一个$project用于从toy_数组中删除代码

var codearray = [17001, 17003, 17005, 17005];
db.collection.aggregate([
  {$match: {"toys.code": {$in: codearray }}},
  {$project: {
      _id: "$toystore_name",
      toy_array: {
        $reduce: {
          input: {
            $map: {
              input: codearray,
              as: "qcode",
              in: {
                $filter: {
                  input: "$toys",
                  as: "toy",
                  cond: {$eq: [ "$$toy.code","$$qcode" ]}
                }
              }
            }
          },
          initialValue: [],
          in: {
            $cond: {
              if: {$eq: ["$$this",[]]},
              then: "$$value",
              else: {$concatArrays: ["$$value", "$$this"]}
            }
          }
        }
      }
  }},
  {$project: {"toy_array.code": 0}}
])