我有一个用户文档,如:
{
_id: "s0m3Id",
_skills: ["skill1", "skill2"],
}
现在,我想通过_skills
字段展开此文档,并为每项技能添加分数。所以我的聚合看起来像:
{
'$unwind': {'path': '$_skills', 'preserveNullAndEmptyArrays': true},
},
{
'$project': {
'_skills':
'label': '$_skills',
'skill_score': 1
},
}
},
有时_skills
字段可以为空,但在这种情况下,我仍然希望用户文档流过聚合 - 因此preserveNullAndEmptyArrays
参数。但是,我遇到的问题是它会将skill_score
(尽管没有label
)投影到具有空_skills
数组字段的文档上。因此,当我稍后转到$group
文档时,这些文档现在有一个非空的_skills
数组,其中包含一个对象,即{skill_score: 1}
。这不是我想要的 - 我希望有空(或不存在)_skills
字段的文档没有任何技能标记投射到它们上。
那么我如何根据另一个字段的存在有条件地设计一个字段?使用$exists
没有帮助,因为它用于查询,而不是用于布尔表达式。
答案 0 :(得分:3)
<强>更新强>
如果Observable.create()
不存在,此聚合会将from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import json
from rx import Observable
# Variables that contains the user credentials to access Twitter API
access_token = "PUT YOURS HERE"
access_token_secret = "PUT YOURS HERE"
consumer_key = "PUT YOURS HERE"
consumer_secret = "PUT YOURS HERE"
def tweets_for(topics):
def observe_tweets(observer):
class TweetListener(StreamListener):
def on_data(self, data):
observer.on_next(data)
return True
def on_error(self, status):
observer.on_error(status)
# This handles Twitter authetification and the connection to Twitter Streaming API
l = TweetListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)
stream.filter(track=topics)
return Observable.create(observe_tweets).share()
topics = ['Britain', 'France']
tweets_for(topics) \
.map(lambda d: json.loads(d)) \
.subscribe(on_next=lambda s: print(s), on_error=lambda e: print(e))
的值设置为skill_score
,然后使用$redact
删除0
等于的子文档_skills
:
skill_score
结果如下:
0