标签: aggregation-framework

Mongo聚合没有更新实际文档

从下面的示例可以看出,当我进行聚合时,它会输出所需的结果,但实际结果没有被替换。有人可以告诉我如何保留聚合o/p吗?

> db.demo95.find();
{ "_id" : ObjectId("5eed924ae3fc5c755e1198a2"), "Id" : "5ab9cbe531c2ab715d42129a" }
> db.demo95.aggregate([ { "$addFields": { "Id" : { "$toObjectId": "$Id" } }} ])
{ "_id" : ObjectId("5eed924ae3fc5c755e1198a2"), "Id" : ObjectId("5ab9cbe531c2ab715d42129a") }
> db.demo95.find();
{ "_id" : ObjectId("5eed924ae3fc5c755e1198a2"), "Id" : "5ab9cbe531c2ab715d42129a" }
Run Code Online (Sandbox Code Playgroud)

aggregate mongodb aggregation-framework

2
推荐指数
1
解决办法
2536
查看次数

Mongodb 聚合以对数组中最常见的项目进行排序?

集合中的项目包含一个字符串数组。我想查找数组中最匹配元素的项目并对其进行排序。

考虑一个集合:

[
    {
        "item_name":"Item_1",
        "tags":["A","B","C","D","E"]
    },
    {
        "item_name":"Item_2",
        "tags":["A","B","D","E","G"]
    },
    {
        "item_name":"Item_3",
        "tags":["B","C","E","H"]
    }

]
Run Code Online (Sandbox Code Playgroud)

我想基于像 ["B","D","G","F"] 这样的数组对集合进行排序,它将返回

[

    {
        "item_name":"Item_2",
        "tags":["A","B","D","E","G"]
    },
    {
        "item_name":"Item_1",
        "tags":["A","B","C","D","E"]
    },
    {
        "item_name":"Item_3",
        "tags":["B","C","E","H"]
    }

]
Run Code Online (Sandbox Code Playgroud)

预期的顺序将是 Item_2、Item_1,然后是 Item_3,因为,

  • Item_2 匹配 3 个项目(“B”、“D”和“G”)
  • 然后 Item_1 有 2 个匹配项(“B”和“D”)
  • 最后 Item_3 有 1 场比赛(“B”)

如果不在 mongodb 中,JavaScript 方法也将受到赞赏

javascript mongoose mongodb mongodb-query aggregation-framework

2
推荐指数
1
解决办法
557
查看次数

检查匹配查询聚合mongodb中是否存在字段

我有一个 mongodb 事件集合,我想从中获取当前可用事件,所以我正在使用这样的匹配查询

   Event.aggregate([ { $match: { isActive: true, ...matchQuery, startDate:{$lt:today}, endDate:{$gt:today} } },])
Run Code Online (Sandbox Code Playgroud)

问题是,并非我的数据库中的所有事件都有 startDate 和 enDate 字段,我也想获取这些事件,所以我想检查 startDate 和 endDate 是否存在,那么如果它们不存在,它们应该比今天的 lt 和 gt并且该文档与查询的其余部分匹配,我想获取它。我尝试了这种方法,但不起作用

{ $match: { isEnabled: true, ...matchQuery, startDate ? {startDate:{$lt:today}}, endDate ?  endDate:{$gt:today} } },
  
Run Code Online (Sandbox Code Playgroud)

谢谢

match mongodb aggregation-framework

2
推荐指数
1
解决办法
7891
查看次数

MongoDB.net 驱动程序 - 项目到不同的类

当尝试将类型化文档投影到不同的类中时,我得到以下信息:在表达式树 new NewItem({document}, 1021) 中的类型“ NewItem ”上找不到构造函数参数“origItem”的成员匹配。

类的简化示例如下:

public class OriginalItem
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public IList<double> Data { get; set; }
    
    public OriginalItem() { }
}
public class NewItem
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public double Value { get; set; }
    
    public NewItem() { }
    public NewItem( OriginalItem origItem, int targetIdx )
    {
        Id = …
Run Code Online (Sandbox Code Playgroud)

.net c# mongodb aggregation-framework mongodb-.net-driver

2
推荐指数
1
解决办法
1836
查看次数

Spring Data 中的 MongoDB $addField 和 $indexOfArray

我正在尝试根据 Asya Kamsky 的帖子使用 MongoDB 和 Spring Data 实现自定义排序:

List<AggregationOperation> operations = new ArrayList<>();

operations.add(Aggregation.addFields().addField("scorrrz")
        .withValueOfExpression("{ \"$indexOfArray\" : [ [\"John\", \"Bill\"], \"$name\" ] }").build());
Run Code Online (Sandbox Code Playgroud)

当我尝试执行此操作时,我得到:

ERROR a.insurance.misc.ErrorAttributes - /api/v1/insurance/opportunity/all
org.springframework.expression.spel.SpelParseException: Expression [{ "$indexOfArray" : [ ["John", "Bill"], "$name" ] }] @29: EL1043E: Unexpected token. Expected 'rsquare(])' but was 'comma(,)'
Run Code Online (Sandbox Code Playgroud)

这不是正确的语法吗?如何使用 Spring Data 来完成此操作?

mongodb spring-data aggregation-framework spring-data-mongodb

2
推荐指数
1
解决办法
2791
查看次数

$expr 中的 mongodb $in 运算符不使用索引

我需要包含多个标识符的文档

它不起作用(冻结):

db.collection.aggregate([{
    $match: {
        $expr: {
            $in: ['$_id', [4, 6]]
        }
    }
}]);
Run Code Online (Sandbox Code Playgroud)

但它有效:

db.collection.find({
    _id: {
        $in: [4, 6]
    }
});
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

2
推荐指数
1
解决办法
1811
查看次数

查找后在对象数组中设置字段。蒙古数据库

我有两个收藏usersposts

用户有这样的文档:

{
  _id: ObjectId('611142303c409b5dc826e563'),
  name: 'foo'
}
Run Code Online (Sandbox Code Playgroud)

posts有这样的文档:

{
  _id: ObjectId('611142303c409b5dc826e111'),
  comments:[
    {
      owner: ObjectId('611142303c409b5dc826e563'),
      description: "my description"
    },
    {
      owner: ObjectId('611142303c409b5dc826e333'),
      description: "my description2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

当我收到服务器端的请求时,我需要返回所有者的整个文档,而不仅仅是其 id。

例如对于一个 get 请求我必须返回:

{
  _id: ObjectId('611142303c409b5dc826e111'),
  comments:[
    {
      owner:{
        _id: ObjectId('611142303c409b5dc826e563'),
        name: 'foo'
    },
      description: "my description"
    },
    {
      owner:     {
        _id: ObjectId('611142303c409b5dc826e555'),
        name: 'foo2'
      },
      description: "my description2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

为此,我执行了以下管道:

[
  $lookup:{
    from: 'owners',
    localField: 'comments.owner',
    foreignField: '_id',
    as: 'owners_comments' …
Run Code Online (Sandbox Code Playgroud)

mongodb node.js mongodb-query aggregation-framework

2
推荐指数
1
解决办法
962
查看次数

如何 $push 聚合中的所有文档而不是特定字段

我在聚合管道的第一阶段使用以下方法得到了这组结果$match

[
  { a: 1, b: 2 },
  { a: 3, b: 4 }
]
Run Code Online (Sandbox Code Playgroud)

现在我想对所有 A 和 B 求和,并且仍然保留它们,因此我将得到如下结果:

{
  total_sum: 10,
  items: [...] // first and second objects ofcourse
}
Run Code Online (Sandbox Code Playgroud)

我尝试过$group$push但是,push 只从对象中推送特定字段,我需要命名 A 和 B,而不是解析所有它们。

我该怎么做?

aggregation mongodb nosql aggregation-framework

2
推荐指数
1
解决办法
2430
查看次数

Mongo:查找有0个关联文档的文档,成本较低

我有Orders 和Shops。

db={
  "orders": [
    {
      "_id": 1,
      "shop": 1,
      "price": 11
    },
    {
      "_id": 2,
      "shop": 2,
      "price": 101
    },
    
  ],
  "shops": [
    {
      "_id": 1,
      
    },
    {
      "_id": 2,
      
    },
    {
      "_id": 3,
      
    },
    
  ],
  
}
Run Code Online (Sandbox Code Playgroud)

我想找出哪些商店的订单数为0。

我是这样做的

db.shops.aggregate([
  {
    $lookup: {
      from: "orders",
      let: {
        shop: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$shop",
                "$$shop"
              ]
            },
            
          },
          
        },
        
      ],
      as: "orders",
      
    },
    
  },
  {
    $project: {
      user: "$user", …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb mongodb-query aggregation-framework

2
推荐指数
1
解决办法
27
查看次数

MongoDB - 使用聚合框架或mapreduce匹配文档中的字符串数组(配置文件匹配)

我正在构建一个可以比作约会应用程序的应用程序.

我有一些像这样结构的文件:

$ db.profiles.find().pretty()

[
  {
    "_id": 1,
    "firstName": "John",
    "lastName": "Smith",
    "fieldValues": [
      "favouriteColour|red",
      "food|pizza",
      "food|chinese"
    ]
  },
  {
    "_id": 2,
    "firstName": "Sarah",
    "lastName": "Jane",
    "fieldValues": [
      "favouriteColour|blue",
      "food|pizza",
      "food|mexican",
      "pets|yes"
    ]
  },
  {
    "_id": 3,
    "firstName": "Rachel",
    "lastName": "Jones",
    "fieldValues": [
      "food|pizza"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在努力识别在一个或多个上相互匹配的配置文件fieldValues.

所以,在上面的例子中,我理想的结果看起来像:

<some query>

result:
[
  {
    "_id": "507f1f77bcf86cd799439011",
    "dateCreated": "2013-12-01",
    "profiles": [
      {
        "_id": 1,
        "firstName": "John",
        "lastName": "Smith",
        "fieldValues": [
          "favouriteColour|red",
          "food|pizza",
          "food|chinese"
        ]
      },
      {
        "_id": 2,
        "firstName": …
Run Code Online (Sandbox Code Playgroud)

mapreduce mongodb aggregation-framework

1
推荐指数
1
解决办法
5481
查看次数