如何在mongodb中聚合期间有条件地投影字段

时间:2016-11-30 22:55:24

标签: mongodb aggregation-framework

我有一个用户文档,如:

{
    _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没有帮助,因为它用于查询,而不是用于布尔表达式。

1 个答案:

答案 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