Фильтровать данные из массива в массиве mongo

#javascript #node.js #arrays #mongodb #mongoose

Вопрос:

У меня есть такая структура данных:

 {
  date: 0,
  darwin: [
    {
      d: ['string1', 1, 0, 0, 0]
    },
    {
      d: ['string2', 1, 0, 0, 0]
    },
    {
      d: ['string3', 1, 0, 0, 0]
    }
  ]
}
 

и эта схема:

 const mongoose = require('mongoose');

const { Schema } = mongoose;

const dataSchema = new Schema({
  date: { type: Number, required: false, unique: true, index: true },
  humanDate: { type: Date, required: false },
  darwin: [
    {
      d: {
        type: Array,
        required: false
      }
    }
  ]
});

module.exports = mongoose.model('data', dataSchema);
 

Мне нужен список строк внутри «d», я пытаюсь это

 db.getCollection('data').find({date:0},{'darwin.d.

но у меня есть эта ошибка

 Error: error: {
"operationTime" : Timestamp(1635348468, 1),
"ok" : 0,
"errmsg" : "positional operator '.

Я пробовал несколько вещей, но не могу получить список строк, я не знаю, применяю ли я оператор '$' неправильно

Я ожидал чего-то подобного

 {
  date: 0,
  darwin: [
    {
      d: 'string1'
    },
    {
      d: 'string2'
    },
    {
      d: 'string3'
    }
  ]
}
 


Ответ №1:

Вы можете использовать агрегированный метод следующим образом:

  • Сначала $match в docuemnts где date указано желаемое значение
  • Затем $project , чтобы отобразить массив и получить нужные значения: для каждого элемента в darwin массиве получите первый элемент в d массиве, используя $arrayElemAt .
 db.collection.aggregate([
  {
    "$match": {
      "date": 0
    }
  },
  {
    "$project": {
      "_id": 0,
      "date": 1,
      "darwin": {
        "$map": {
          "input": "$darwin",
          "as": "m",
          "in": {
            "d": {
              "$arrayElemAt": [
                "$m.d",
                0
              ]
            }
          }
        }
      }
    }
  }
])
 

Какой вывод:

 [
  {
    "darwin": [
      {
        "d": "string1"
      },
      {
        "d": "string2"
      },
      {
        "d": "string3"
      }
    ],
    "date": 0
  }
]
 

Пример здесь

: 1})
но у меня есть эта ошибка


Я пробовал несколько вещей, но не могу получить список строк, я не знаю, применяю ли я оператор '$' неправильно

Я ожидал чего-то подобного


Ответ №1:

Вы можете использовать агрегированный метод следующим образом:

  • Сначала $match в docuemnts где date указано желаемое значение
  • Затем $project , чтобы отобразить массив и получить нужные значения: для каждого элемента в darwin массиве получите первый элемент в d массиве, используя $arrayElemAt .

Какой вывод:


Пример здесь

couldn't find a matching element in the array",
"code" : 51246,
"codeName" : "Location51246",
"$clusterTime" : {
"clusterTime" : Timestamp(1635348468, 1),
"signature" : {
"hash" : BinData(0,"pfgMUIJkpgjlfnQ6cfiEDpSY 3o="),
"keyId" : NumberLong("7020434099001098244")
}
}}
Я пробовал несколько вещей, но не могу получить список строк, я не знаю, применяю ли я оператор ‘$’ неправильно

Я ожидал чего-то подобного


Ответ №1:

Вы можете использовать агрегированный метод следующим образом:

  • Сначала $match в docuemnts где date указано желаемое значение
  • Затем $project , чтобы отобразить массив и получить нужные значения: для каждого элемента в darwin массиве получите первый элемент в d массиве, используя $arrayElemAt .

Какой вывод:


Пример здесь

: 1})

но у меня есть эта ошибка


Я пробовал несколько вещей, но не могу получить список строк, я не знаю, применяю ли я оператор ‘$’ неправильно

Я ожидал чего-то подобного


Ответ №1:

Вы можете использовать агрегированный метод следующим образом:

  • Сначала $match в docuemnts где date указано желаемое значение
  • Затем $project , чтобы отобразить массив и получить нужные значения: для каждого элемента в darwin массиве получите первый элемент в d массиве, используя $arrayElemAt .

Какой вывод:


Пример здесь