【问题标题】:retrieve multiple objects from one which is array of objects in mongodb从 mongodb 中的对象数组中检索多个对象
【发布时间】:2016-01-29 18:49:51
【问题描述】:

我使用 mongodb 将我的用户数据与数组一起保存。 我的问题是如何检索与该用户数组中的给定值匹配的多个对象。像这样:

{ 
    _id: { objid:'0000000000000' },
    userId: 'abc',
    userItems : [
        {
            itemName: 'mango',
            date: 24,
            month: 1,
            year: 2016
        },
        {
            itemName: 'apple',
            date: 24,
            month: 1,
            year: 2016
        },
        {
            itemName: 'orange',
            date: 22,
            month: 1,
            year: 2016
        },
        {
            itemName: 'vanilla',
            date: 23,
            month: 1,
            year: 2016
        }
    ]
}

预期结果是

{
    _id: { objid: '0000000000000' },
    userId: 'abc',
    userItems: [
        {
            itemName: 'mango',
            date: 24,
            month: 1,
            year: 2016
        },
        {
            itemName: 'apple',
            date: 24,
            month: 1,
            year: 2016
        }
    ]
}

我想要此 userId userItems 数组中与日期、月份、年份匹配的所有元素,请帮助我解决此问题

【问题讨论】:

标签: arrays mongodb mongodb-query


【解决方案1】:

我们可以通过聚合框架找到结果。

db.user.aggregate(
   {
     $unwind : "$userItems" 
   },
   {
      $match: {
        "userItems.date" : 24, 
        "userItems.month" : 1, 
        "userItems.year" : 2016
      }
   },
   {
      $group: {
         "_id" : { "id":"$_id","userId":"$userId"},
         "userItems" : {$push:"$userItems"}
      }
   },
   {
       $project:{
          "_id": "$_id.id", 
          "userId": "$_id.userId",
          "userItems": 1 
       }
   }
)

【讨论】:

  • 我以前见过那种格式,但我从来没有用过,所以我无法评论是否是最好的方法。无论如何都要支持,因为我知道这是一种方法。
  • 这是mongo中最好的东西,你必须学习。聚合框架有利于对所需数据进行分组和投影。当集合规模越来越大时最好。
  • 谢谢,我去看看。
  • 感谢所有这些答案解决了我的问题,但对于我的问题,我不需要 $projection。谢谢谢谢大家
  • 欢迎。我已经提供了 $projection 以提供有关如何投影来自组的结果的知识。该项目将提供与您的输入类似的对象。您可以使用或不使用投影,这是您的需要。如果有人指点你正确的方向或答案,你应该接受答案。您一定没有访问我在最后评论中给出的链接。人们会看到您的接受率。
【解决方案2】:
db.collectioName.find(
   {
      nameOfArrayYouarelookingIn: {
         $elemMatch: {
            ArrayFieldOneName: 1,
            ArrayFieldTwoName: 'blahblah'
         }
      }
   }
)

有关更多详细信息和示例,请参阅$elemMatch documentation。

【讨论】:

  • 我用过它,但它只给了我第一个匹配的对象,不超过那个
  • 这将匹配整个文档。并且不在数组属性内提供匹配的对象。 @VSO 检查我的答案
猜你喜欢
  • 2021-05-13
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多