【问题标题】:How filter array of objects elements mongoose?如何过滤对象数组的元素猫鼬?
【发布时间】:2023-04-01 13:37:02
【问题描述】:

我有以下架构:

User: {
  age: Number,
  name: String,
  comments: {
    added: Date,
    body: String
  }
}

我需要获取所有用户,添加的 cmets 大于自定义日期。

示例数据:

[{
  "name": "John",
  "age: 21,
  "comments": [{
     "added": 21-01-12,
     "body": "blabla1"    
  }, {
     "added": 21-02-12,
     "body": "blabla2"    
  }, {
     "added": 21-01-10,
     "body": "blabla3"   
  }]
}, {
  "name": "Bruno",
  "age: 33,
  "comments": [{
     "added": 21-01-10,
     "body": "ololo1"    
  }, {
     "added": 21-02-12,
     "body": "ololo2"    
  }, {
     "added": 21-01-09,
     "body": "ololo3"   
  }]
}]

我需要所有 cmets 大于 01-01-11 且 cmets 小于此日期的所有用户。

预期结果:

{
  "name": "John",
  "age: 21,
  "comments": [{
     "added": 21-01-12,
     "body": "blabla1"    
  }, {
     "added": 21-02-12,
     "body": "blabla2"    
  }]
}, {
  "name": "Bruno",
  "age: 33,
  "comments": [{
     "added": 21-02-12,
     "body": "ololo2"    
  }]
}

我该怎么办?

【问题讨论】:

  • 看看$filter
  • 这是正确的过滤器,但结果我有所有用户,有空的 cmets 等等,但我只想要有需要 cmets 的用户
  • 请添加您目前的查询

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:
const findQuery = [
    {$unwind: "$comments" },
    {$match: {"comments.added": {$gt: lastUpdate} } },
    {$group: {_id: "$_id", comments: {$push: "$comments"} } }
];

User.aggregate(findQuery)

【讨论】:

    【解决方案2】:

    要过滤 Mongoose(和 mongo)中的日期字段,您需要使用 $gte、$gt、$lt、$lte。在您的具体示例中,您需要 $gte (大于或等于)

    所以,如果您的模型是用户 User.find({cmets.added : {$gte : new Date(2011, 1, 1)}}, function(err, cmets) {

    });

    除非有某些原因,我可能会建议您选择更准确的 ISODate,您也可以这样做来过滤条目

    每小时

    【讨论】:

    • 我使用isodate,这是一个简单的例子。其他评论(日期 $lt: new Date(2011, 1, 1))不会出现在结果中?
    • 刚刚使用 ISODate 对我的 MongoDB 数据库进行了操作:User.find({cmets.add: {$gte: new ISODate("2011-01-01T00:00:00.000Z")}}, function (错误,条目){
    • 我这样做了,但结果是我的用户拥有所有 cmets,但我只想获得 cmets $gt 日期。但结果我有所有的 cmets(
    • 哦!我理解这种误解,请记住,您的 cmets 是嵌入式文档,因为您获得了与过滤器匹配的文档 $gte new ISODate、文档、期间。除非我错了,否则您不能期望 Mongoose 删除一些嵌入的文档,因为它们与过滤器不匹配,如果至少有一个文档与过滤器匹配。您应该使用纯 JS 修剪嵌入文档后
    • 在 js 中过滤 - 非常困难的方式。我认为应该始终尝试制作数据库工具。我现在找到了解决方案)
    猜你喜欢
    • 2021-11-17
    • 2018-02-15
    • 2020-10-28
    • 2022-01-11
    • 2021-03-06
    • 2017-04-29
    • 2021-10-28
    • 2023-01-30
    • 2015-12-28
    相关资源
    最近更新 更多