Как создать массив, содержащий массивы на MongoDB - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь сделать запрос к mongodb. Я хочу получить массив, содержащий [местоположение, статус] каждого документа. Вот так выглядит моя коллекция

{
"_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"
}

Я сделал запрос, используя агрегатную среду, пытаясь получить все документы, соответствующие указанному типу c хранилища.

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

Я хочу что-то вроде этого:

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

Я пытался с $ pu sh, но не смог сделать это. Может кто-нибудь, пожалуйста, подскажите мне, как это сделать.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Так как { $push: ["$location", "$status"] } выдаст вам ошибку The $push accumulator is a unary operator. Вам придется немного обойти его, передав ему один объект, который выдает желаемый массив. Один из способов сделать это будет:

[
  {
    "$match": {
      "type": {
        "$eq": "physical store"
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "stores": {
        "$push": {
          "$slice": [["$location", "$status"], 2]
        }
      }
    }
  }
]
0 голосов
/ 30 апреля 2020

Если данные документы не являются субдокументами, то ниже представлен подход:

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

MongoPlayGround для ссылки выше

Если они являются часть поля (означает, что они являются поддокументами), то ниже приведен подход:

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 ссылка для вышеупомянутого

...