我有一个像这样结构的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
的许多不同的排列。过滤掉未发布的推文的正确方法是什么?
答案 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;
}
});