【问题标题】:Intersect in mongodb from two records从两条记录在mongodb中相交
【发布时间】:2017-12-05 07:38:21
【问题描述】:

MongoDb + Spring boot + intersectsArrays

我想随机获取 15 个用户并了解他们的共同兴趣。文档结构是这样的

{
    "_id": {
      "$oid": "593f773202338a47584b351e"
    },
    "interests": [
      {
        "_id": {
          "$oid": "5957933cf3c5f5253ec9476c"
        },
        "name": "abc1",
        "facebookId": "123"
      }]
    ]
  }

需要为 mongo 返回的每个用户获取共同兴趣。

下面是我的 Spring 启动代码

Criteria criteria = new Criteria().andOperator(Criteria.where("lastLoginDate").gte(Utility.getDateBeforeDays(lastLoginNewerThan)));
        Aggregation agg = Aggregation.newAggregation(new CustomAggregationOperation(maxRecords),
                Aggregation.match(criteria),Aggregation.project("id","name")
                );
        AggregationResults<Users> userResults = operations.aggregate(agg, Users.class, Users.class);
        List<Users> users = userResults.getMappedResults();

【问题讨论】:

  • 您的代码没有太多细节,无法推断出哪个部分不适合您。您的标题建议获取两个数组之间的交集,但您的帖子建议获取多个用户的共同兴趣。您能否通过在帖子中添加示例预期输出和输入来进一步澄清?
  • @Veeram 它的 Tinder 类型的应用程序,我随机获得 15 个人,需要显示共同兴趣的数量。我可以使用上面的代码找到附近的 15 个人,但找不到共同的兴趣。它是这样的。我正在搜索 nearBy Guys 并获取您的个人资料,然后我必须显示我们之间有多少共同兴趣。
  • 您可以使用setIntersection 将您的兴趣(应该输入)与每个随机人的兴趣进行比较。
  • @veeram 你能否在春季启动时提供代码 sn-p

标签: mongodb spring-boot mongodb-query aggregation-framework spring-data-mongodb


【解决方案1】:

看起来 Spring Mongo Data api 没有提供将值列表作为输入传递给集合交集运算符的方法。

您可以使用AggressionExpression 提供自定义实现。在项目阶段包括下面的投影。

.and(new AggregationExpression() {
       @Override
        public DBObject toDbObject(AggregationOperationContext context) {
            return new BasicDBObject("$setIntersection",
                Arrays.<Object> asList(
                     Arrays.<Object> asList("reading","movies"),
                         "$interests"));
            }
}).as("commonInterests"));

您可以将表达式包装为 Java 8 的 lambda

and(context -> new BasicDBObject("$setIntersection",
            Arrays.<Object> asList(
                 Arrays.<Object> asList("reading","movies"),
                   "$interests")))
.as("commonInterests");

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多