Это сводит меня с ума уже несколько дней.
Предположим, следующая схема:
'use strict';
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const dSchema = new Schema({
dKey: {type: String, required:true},
dProp1: {type: String},
dProp2: {type: String},
})
const component_dModel = mongoose.model('d', dSchema);
const cSchema = new Schema({
cKey: {type:String, required:true},
cProp1: {type: String},
cProp2: {type: String},
d: [dSchema]
})
const component_cModel = mongoose.model('c', cSchema);
const bSchema = new Schema({
bKey: {type:String, required:true},
bProp1: {type: String},
bProp2: {type: String},
c: [cSchema]
})
const component_bModel = mongoose.model('b', bSchema);
const aSchema = new Schema({
aKey: {type:String, required: true, unique: true},
aProp1: {type: String},
aProp2: {type: String},
b: [bSchema]
})
module.exports = mongoose.model('test_databases',aSchema);
Предположим, я вставил в свою коллекцию следующие два документа:
{
"aKey": "aKey1",
"aProp1" : "value",
"aProp2" : "value",
"b" : [
{
"bKey": "bKey1",
"c": [
{
"cKey": "cKey1"
},
{
"cKey": "ckey2"
}
]
},
{
"bKey" : "bKey2"
}
]
}
и:
{
"aKey": "aKey2",
"aProp1" : "value",
"aProp2" : "value",
"b" : [
{
"bKey": "bKey1",
"c": [
{
"cKey": "cKey1"
},
{
"cKey": "ckey2"
}
]
},
{
"bKey" : "bKey2"
},
{
"bKey" : "bKey3",
"c": [
{
"cKey": "cKey1"
},
{
"cKey": "ckey2"
}
]
}
]
}
Во-первых, я использую mongoose, и когда я создаю схемы, все отсутствующие схемы превращаются в пустые массивы, что раздражает, но я написал некоторый код для их очистки (этот кодон не используется в этом тестовом коде, поэтому вы видите пустые массивы d).Проблема, которую мои запросы не отвечают так, как я ожидаю.
Я хочу иметь возможность получить все свойства для конкретного документа aKey и всего, что находится под ним, или все свойства для конкретного документа aKey и толькосвойства в конкретном документе bKey и ниже и т. д.
Работает для верхнего уровня:
db.test_databases.find({aKey: 'aKey1'})
возвращает только документ akey aKey1.Это то, что я ожидаю
Однако:
db.test_databases.find({aKey: 'aKey2', 'b.bKey':'bKey1', 'b.c.cKey':'cKey1'}).pretty()
Я ожидаю, что это вернет свойства в aKey, только свойства в b / bKey1 и только свойства в b / c / cKey1,но вместо этого я получаю слияние всего (см. вывод ниже)
Как мне построить запросы так, чтобы в приведенных выше примерах я не видел b / bKey2 или b / bKey3 и не видел b /c / cKey2, но только b / c / cKey1?
Это вывод, который я получаю:
{
"_id" : ObjectId("5b83a409bd0fef17afa468e8"),
"aKey" : "aKey2",
"aProp1" : "value",
"aProp2" : "value",
"b" : [
{
"_id" : ObjectId("5b83a409bd0fef17afa468ed"),
"bKey" : "bKey1",
"c" : [
{
"_id" : ObjectId("5b83a409bd0fef17afa468ef"),
"cKey" : "cKey1",
"d" : [ ]
},
{
"_id" : ObjectId("5b83a409bd0fef17afa468ee"),
"cKey" : "ckey2",
"d" : [ ]
}
]
},
{
"_id" : ObjectId("5b83a409bd0fef17afa468ec"),
"bKey" : "bKey2",
"c" : [ ]
},
{
"_id" : ObjectId("5b83a409bd0fef17afa468e9"),
"bKey" : "bKey3",
"c" : [
{
"_id" : ObjectId("5b83a409bd0fef17afa468eb"),
"cKey" : "cKey1",
"d" : [ ]
},
{
"_id" : ObjectId("5b83a409bd0fef17afa468ea"),
"cKey" : "ckey2",
"d" : [ ]
}
]
}
],
"__v" : 0
}
Это вывод, который я хочу:
{
"_id" : ObjectId("5b83a409bd0fef17afa468e8"),
"aKey" : "aKey2",
"aProp1" : "value",
"aProp2" : "value",
"b" : [
{
"_id" : ObjectId("5b83a409bd0fef17afa468ed"),
"bKey" : "bKey1",
"c" : [
{
"_id" : ObjectId("5b83a409bd0fef17afa468ef"),
"cKey" : "cKey1",
"d" : [ ]
},
]
},
],
"__v" : 0
}