如何创建包含 MongoDB 上的数组的数组

How to create an array containing arrays on MongoDB

我正在尝试查询 mongodb。我想获得一个包含每个文档的 [location, status] 的数组。 这就是我的 collection 的样子

{
"_id": 1,
  "status": "OPEN",
  "location": "Costa Rica",
  "type": "virtual store"
},
{
  "_id": 2,
  "status": "CLOSED",
  "location": "El Salvador"
  "type": "virtual store"
},
{
  "_id": 3,
  "status": "OPEN",
  "location": "Mexico",
  "type": "physical store"
},
{
  "_id": 4,
  "status": "CLOSED",
  "location": "Nicaragua",
"type": "physical store"
}

我使用聚合框架进行了查询,试图获取与该特定类型的商店匹配的所有文档。

{
 {'$match': {
   'type': { '$eq': "physical store"}
 }
}

我想要的是这样的:

{
  {
  'stores': [
    ["Mexico", "OPEN"],
    ["Nicaragua", "CLOSED"]
   ]
 },
}

我尝试使用 $push 但无法成功。 有人可以指导我如何操作吗?

因为 { $push: ["$location", "$status"] } 会给你错误 The $push accumulator is a unary operator。您将不得不通过将输出所需数组的单个对象传递给它来解决它。一种方法是:

[
  {
    "$match": {
      "type": {
        "$eq": "physical store"
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "stores": {
        "$push": {
          "$slice": [["$location", "$status"], 2]
        }
      }
    }
  }
]

如果给定的文档不是子文档,那么方法如下:

db.collection.find({
  type: {
    $eq: "physical store"
  }
},
{
  location: 1,
  status: 1
})

MongoPlayGround link for the above

如果,它们是一个字段的一部分(意味着它们是子文档),那么下面是方法:

db.collection.aggregate([
  {
    $project: {
      stores: {
        $filter: {
          input: "$stores",
          as: "store",
          cond: {
            $eq: [
              "$$store.type",
              "physical store"
            ]
          }
        }
      }
    }
  },
  {
    $unwind: "$stores"
  },
  {
    $project: {
      location: "$stores.location",
      status: "$stores.status",
      _id: "$stores._id"
    }
  }
])

MongoPlayGround link for the above