1

我正在使用带有 Mongodb API 的 Azure cosmos db。我也使用猫鼬来创建模式并在数据库中创建新文档。我也在使用 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)
  })

我很感激任何提示!:)

4

1 回答 1

0

_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);
});

在此处输入图像描述

于 2019-02-18T09:40:54.090 回答