在Mongo / Meteor中过滤(嵌套)布尔字段

时间:2017-08-02 17:21:58

标签: mongodb meteor

我有一个像这样结构的Mongo集合(使用Meteor):

{
    "_id" : "xx",
    "name" : "xx",
    "handle" : "xx",
    "tweets" : [
        {
            "published" : true,
            "tweet_id" : "xx",
            "text" : "xx",
            "created_at" : "Mon Jul 31 18:18:38 +0000 2017",
            "retweet_count" : 0,
            "from" : "x",
            "from_full_name" : "x",
            "from_profile_image" : "x"
        },
        {
            "published" : true,
            "tweet_id" : "xx",
            "text" : "xx",
            "created_at" : "Mon Jul 31 18:18:38 +0000 2017",
            "retweet_count" : 0,
            "from" : "x",
            "from_full_name" : "x",
            "from_profile_image" : "x"
        },
        {
            "published" : false,
            "tweet_id" : "xx",
            "text" : "xx",
            "created_at" : "Mon Jul 31 18:18:38 +0000 2017",
            "retweet_count" : 0,
            "from" : "x",
            "from_full_name" : "x",
            "from_profile_image" : "x"
        },
    ]
}

我只想显示已发布的推文。我正在使用模板助手来检索和过滤:

return Tweets.find({
    handle:handle,
    "tweets.published": true
});

我似乎无法让“已发布”的嵌套过滤器起作用。使用上面的代码显示所有推文。我尝试了"tweets.published": true的许多不同的排列。过滤掉未发布的推文的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

由于tweets字段是一个对象数组,而不仅仅是一个对象,因此您的方法将无效。

首先,您应该使用句柄来查找正确的文档:

return Tweets.find({
  handle: handle,
});

然后必须将其与fields结合使用,以选择应返回的推文。

return Tweets.find({
  handle: handle,
}, {
  fields: { tweets: { $elemMatch: { published: true } } } 
});

$elemMatch部分指定必须发布推文。更多信息on the mongo page

EDIT 如果代码段必须在客户端上运行(在您的情况下),您还有其他选项。您可以将服务器出版物与我的代码段一起使用,仅将已发布的推文发送给客户端。

或者,将转换选项提供给查找请求。

return Tweets.find({
  handle: handle
}, {
  transform: doc => {
    doc.tweets = doc.tweets.filter(tweet => tweet.published);
    return doc;
  }
});