Meteor.js + MongoDB::从深度嵌套的数组中检索值

Meteor.js + MongoDB :: Retrieve values from deeply nested arrays

本文关键字:数组 检索 嵌套 深度 js MongoDB Meteor      更新时间:2023-09-26

我很难得到这个结果:

["Chadstone", "South Yarra"]

当给定这两个值时:

name: 'Soda Rock'
city: 'Melbourne'

从本文档:

{
    "_id" : "axHqB4NjXbWwphik3",
    "name" : "Soda Rock",
    "storeLocation" : [
        {
            "state" : "Victoria",
            "outlet" : [
                {
                    "city" : "Melbourne",
                    "name" : ["Chadstone", "South Yarra"]
                },
                {
                    "city" : "Geelong",
                    "name" : ["Myer", "Market Square"]
                }
            ]
        },
        {
            "state" : "New South Wales",
            "outlet" : [
                {
                    "city" : "Sydney",
                    "name" : ["Westfield", "Broadway Shopping Centre"]
                }
            ]
        }
    ]
}



我尝试了一些方法,但没有一个输出我想要的结果。

方法# 1:

Stores.find(
    {
        'name': 'Soda Rock', 
        'storeLocation.outlet.city': 'Melbourne'
    }, 
    {
        _id: 0, 
        'storeLocation.outlet.name.$': 1
    }
);

结果:

{
    "storeLocation" : [
        {
            "state" : "Victoria",
            "outlet" : [
                {
                    "city" : "Melbourne",
                    "name" : ["Chadstone", "South Yarra"]
                },
                {
                    "city" : "Geelong",
                    "name" : ["Myer", "Market Square"]
                }
            ]
        }
    ]
}
方法# 2:

Stores.find(
    {
        'name': 'Soda Rock', 
        'storeLocation.outlet.city': {
            'Melbourne'
        }
    }, 
    {
        _id: 0, 
        'storeLocation.outlet.name': 1
    }
);

结果:

{
    "storeLocation" : [
        {
            "outlet" : [
                {
                    "name" : ["Chadstone", "South Yarra"]
                },
                {
                    "name" : ["Myer", "Market Square"]
                }
            ]
        },
        {
            "outlet" : [
                {
                    "name" : ["Westfield", "Broadway Shopping Centre"]
                }
            ]
        }
    ]
}

我也试过使用meteorhacks:aggregate,但是无法使它工作,因为我没有找到一个对新手友好的文档。

非常感谢您的解决方案和友好的解释!

在这里使用聚合似乎有点过头了。下面是一个提取出口名称的示例函数:

var findOutletName = function(name, city) {
  var doc = Stores.findOne({name: name});
  var outletName = null;
  _.each(doc.storeLocation, function(location) {
    _.each(location.outlet, function(outlet) {
      if (outlet.city === city)
        outletName = outlet.name;
    });
  });
  return outletName;
};

可以这样使用:

findOutletName('Soda Rock', 'Melbourne');

非常确定,在标准的Meteor中没有办法做到这一点。聚合包可能会有所帮助,但我也没有用过它。我将使用方法1来检索文档,然后过滤文档,以找到您想要使用标准javascript的信息(或类似下划线可能会帮助您。)