在下拉列表更改中搜索mongodb数组以获取字段值

时间:2015-09-08 21:21:48

标签: mongodb meteor

我有一个下拉列表需要为Mongo中的特定文档触发findOne。我希望它只返回它找到值的数组。

下拉列表html:

<select class="form-control" id="saved_config" name="saved_config">
    {{#each currentUser.profile.saved_configs}}
        <option value="{{config}}">{{config}}</option>
    {{/each}}
</select>

拉动&#34; config&#34;来自每个&#34; saved_configs&#34;的字段值数组当前位于当前用户的个人资料部分。

下拉列表js:

"change #saved_config": function(event, template) {
    var selected = $( "#saved_config option:selected" ).text();
    var search = Meteor.users.findOne({_id:Meteor.user()._id}, {'profile.saved_configs.$' : selected});

    console.log(search)

},

听取下拉列表更改并找到一个包含&#34; _id&#34;的文档。使用当前用户的ID,并搜索&#34; saved_configs&#34;中的所有数组。对于下拉选择的文本。

问题在于,无论我设置什么值,它都会返回整个文档&#34; profile.saved_configs。$&#34;如。我还希望它只返回它找到下拉文本的数组。这样我就可以轻松地检索同一数组中的其余值。

这是doc架构 -

  • _id:

  • 配置文件:

    • saved_configs:
      • [阵列]
      • [阵列]

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找this functionality

但是,流星文档声明:Field operators such as $ and $elemMatch are not available on the client side yet.

然而,由于您在客户端上有完整的文档,因此在javascript中选择正确的数组应该很简单。即使你有Field Operator支持,这一切都发生在客户端(并且你没有从服务器请求额外的数据)所以在我看来,在javascript中执行它没有任何缺点。

我猜测saved_configs中项目的结构,但代码是这样的:

"change #saved_config": function(event, template) {
  var selected = $( "#saved_config option:selected" ).text();
  var _search = Meteor.users.findOne({_id:Meteor.user()._id});
  var search = _search.profile.saved_configs.filter(
       function(config){ 
         return config.name === selected;
       })[0]     // .filter returns array, select first (only) item
  console.log(search)
},