Как получить только дочерний объект в Azure Cosmos, используя mongoose и Node.js? - PullRequest
0 голосов
/ 16 февраля 2019

Я использую Azure Cosmos db с Mongodb API.Также я использую mongoose для создания схем и создания новых документов в базе данных.Я также использую Node.js.

На данный момент я рассматриваю вопрос об использовании отношения «один ко многим» со встроенными документами.

Структура данных выглядит следующим образом:

{
    "_id" : "locality1",
    "_type" : "Locality",
    "name" : "Wallmart",
    "subsectionList" : [
        {
            "_id" : "subsection1",
            "_type" : "SubSection",
            "name" : "First floor",
            "sensorList" : [
                {
                    "_id" : "sensor1",
                            "_type" : "Sensor",
                    "placement" : "In the hallway"
                },
                {
                    "_id" : "sensor2",
                            "_type" : "Sensor",
                    "placement" : "In the ceiling"
                }
            ]
        },
        {
            "_id" : "subsection2",
            "_type" : "SubSection",
            "name" : "Second floor",
            "sensorList" : [ ],
        }
    ],
}

Я хочу получить ТОЛЬКО объект «sensor1», а не что-либо из родительского объекта.

Используя запросы, я могу получить только весь объект «locality1» со всеми его подразделами и датчиками.,В более крупном масштабе, который является ненужным большим количеством данных.

Вот мой запрос.

Locality.find().where('subsectionList.sensorList._id').equals("sensor1").then(doc => {
    console.log(doc)
  })

Я ценю любые советы!:)

1 Ответ

0 голосов
/ 18 февраля 2019

Основываясь на моем тесте, я все равно не могу избавиться от свойства _id, хотя я следовал параметрам, упомянутым здесь .

Locality.find({},'subsectionList', function (err, locas) 

Приведенный выше запрос по-прежнему возвращает результаты, включая свойство _id. (Похоже, элемент по умолчанию)

Я получаю обходной путь из этого блога , который выможет зациклить массив для фильтрации желаемых столбцов.

var mongoose = require('mongoose');
var COSMOSDB_CONNSTR= "mongodb://***.documents.azure.com:10255/db";
var COSMODDB_USER= "***";
var COSMOSDB_PASSWORD= "***";

mongoose.connect(COSMOSDB_CONNSTR+"?ssl=true&replicaSet=globaldb", {
  auth: {
    user: COSMODDB_USER,
    password: COSMOSDB_PASSWORD
  }
}).then(() => console.log('Connection to CosmosDB successful'))
.catch((err) => console.error(err));

const Locality = mongoose.model('Locality', new mongoose.Schema({
    _id: String,
    subsectionList: [{
        sensorList: [{
            _id: String,
            _type: String,
            placement: String
        }]
    }]
}));

Locality.find({},'subsectionList', function (err, locas) {
  if (err) return handleError(err);

  var returnArray = [];
  for(var i = 0; i<locas.length;i++){
      for(var j = 0; j<locas[i].subsectionList.length;j++){
          for(var k = 0; k<locas[i].subsectionList[j].sensorList.length;k++){
           if(locas[i].subsectionList[j].sensorList[k]._id == 'sensor1')
             returnArray.push(locas[i].subsectionList[j].sensorList[k]);
          }
      }
  }
  console.log(returnArray);
});

enter image description here

...