如何使用子对象作为字段来表示查询?

时间:2017-03-24 19:21:49

标签: mongodb meteor

如何制定使用子对象字段返回游标的查询?

我的对象结构如下所示:

_id: "4ncBGvppEs92e4tcZ"
expiryDate: "2017-05-27T21:45:57+03:00"
viewStatisticsArray: Array[1]
     0: Object
           nrOfViews:155
           statesDate:"Fri Mar 24 2017 12:46:21 GMT+0300 (EAT)"
           viewedBy: "udEnfEmy5DSBvDsSy"

请注意,viewedBy (我也称之为子对象)值包含从Meteor.user()._id;生成的用户ID

var MyUserId = Meteor.user()._id;

我没有尝试过:

Db.find({},{viewedBy: { $in: MyUserId } } ).fetch();

也没有尝试过:

Db.find({},{viewStatisticsArray.viewedBy: { $in: MyUserId } } ).fetch();

请帮忙!如何正确地对上述查询进行论坛? 预期的结果应该在光标中装满只有已经被查看过的对象:" udEnfEmy5DSBvDsSy"。

1 个答案:

答案 0 :(得分:1)

在mongodb(以及Meteor)中,执行此类查询的正确方法是使用$elemMatch运算符。例如,您的查询将如下所示。

Db.find({
  viewStatisticsArray: {
    $elemMatch: {
      viewedBy: MyUserId 
    }
  }
});

但是,由于您只需要指定单个查询谓词,因此您也可以使用以下查询。

Db.find({
  'viewStatisticsArray.viewedBy': MyUserId 
});

提醒一句,我不知道minimongo(在流星应用程序中运行客户端的mongodb)是否支持$elemMatch运算符。如果是这种情况,并且如果您在客户端上执行此查询,则必须使用上面的第二个选项。