MongoDB find () не работает должным образом для вложенных документов - PullRequest
0 голосов
/ 27 августа 2018

Это сводит меня с ума уже несколько дней.

Предположим, следующая схема:

'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
}
...