#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
.
Какой вывод:
Пример здесь