【问题标题】:Meteor : filter a publication on a nested propertyMeteor:过滤嵌套属性上的发布
【发布时间】:2014-02-24 15:27:46
【问题描述】:

我有一个简单的出版物:

return Companies.find({}, {fields: {'myField1': 1, 'myField2': 1}});

在我的 Companies 集合中,对于每个公司,我都有一个数组 customers 和一个数组 managers。这些数组包含具有“_id”和其他各种属性的对象。

为了可视化,可能会添加一个新公司,如下所示:

Companies.insert({
  customers: [{_id: <userId>, otherProp: <data>}, ...],
  managers: [{_id: <userId>, otherProp: <data>}, ...]
});

这个_id字段是users集合中对应用户的id。

我只想返回可以在客户数组(或经理数组,具体取决于用户)的对象之一中找到用户 _id 的公司。

这可能是一个 mongo 问题,但我不确定。 => 在文档中,他们提到了 mongo 选择器:http://docs.meteor.com/#selectors (http://docs.mongodb.org/manual/reference/operator/query/) 但我不知道如何在我的情况下使用它。

【问题讨论】:

    标签: javascript mongodb collections meteor


    【解决方案1】:

    我看来你可以简单地做:

    Companies.find({'customers._id': this.userId}, {fields: {'stores': 1, 'customers': 1}});

    这将在数组内部搜索。

    但是现在,如何完成过滤,只返回客户的信息,而不是公司所有客户的信息呢?

    答案再次出现在 mongo 文档中!

    我似乎可以在字段上添加投影。 (http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/#proj._S_elemMatch)

    使用适当过滤器的最终请求是: return Companies.find({'customers._id': this.userId}, {fields: {'stores': 1, 'customers': { $elemMatch: { _id: this.userId } }}});

    (最后我并没有那么难,但如果我的回答可以帮助某人...... :))

    【讨论】:

    • 请注意,“最终请求”在 Meteor 中的客户端将不起作用,因为 $elemMatch 尚未在 minimongo 中实现。
    • @fabien 很好的答案,但我有一个小问题。如果我的对象属性名称是动态的怎么办?在这种情况下有什么方法可以查询吗?例如,如果我没有在 customer._id 中预定义“客户”属性怎么办?
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多