【问题标题】:why isnt mongo returning object in array?为什么mongo不在数组中返回对象?
【发布时间】:2012-10-09 08:43:39
【问题描述】:

我正在搜索在文档的联系人数组中包含特定 _id 的文档。结构如下:

{
"_id": ObjectId("505c2daea9d397f2260001cd"),
 "contacts": [
     {
       "userGroupId": ObjectId("50422b53743d6c7c0e000000"),
       "userId": ObjectId("5061f8c66096eee07d000008") 
    },
     {
       "userGroupId": ObjectId("505bf9476096ee990200000e"),
       "userId": ObjectId("505c2daea9d397f2260001ce") 
    },
      {
       "userGroupId": ObjectId("50422b75743d6c700e000004"),
       "userId": ObjectId("506cff736096ee1e26000384") 
    },
     {
       "userGroupId": ObjectId("50422b66743d6c6b0e000000"),
       "userId": ObjectId("505c2daea9d397f2260001cf") 
    },
     {
       "userGroupId": ObjectId("5050e86aa9d3977b67000000"),
       "userId": ObjectId("506494ef6096ee021f000064") 
    },
     {
       "userGroupId": ObjectId("50422b53743d6c7c0e000000"),
       "userId": ObjectId("504d72246096ee2348000008") 
    },
     {
       "userId": ObjectId("50735e8e6096ee7c510002b9"),
       "userGroupId": ObjectId("5046c73e6096ee1b77000001") 
    } 
  ]
}

这是第二份文件:

{
 "_id": ObjectId("505c2da0a9d397f2260000b7"),
"contacts": [
      {
       "userGroupId": ObjectId("50422b66743d6c6b0e000000"),
       "userId": ObjectId("505c2da0a9d397f2260000b8") 
    },
     {
       "userId": ObjectId("5061f8c66096eee07d000008"),
       "userGroupId": ObjectId("50422b53743d6c7c0e000000") 
    },
     {
       "userId": ObjectId("50735e8e6096ee7c510002b9"),
       "userGroupId": ObjectId("5046c73e6096ee1b77000001") 
    } 
  ]
}

您会注意到,两个文档中都有一个 ObjectId("50735e8e6096ee7c510002b9") 的 userId。我运行这个命令:

db.collection.find({ 'contacts': 
    {$elemMatch: { userId: ObjectId("50735e8e6096ee7c510002b9") } }
});

应该(我认为)返回两个文件。但它只返回第二个文档。不是第一个。我也试过:

db.collection.find({'contacts.userId': ObjectId("50735e8e6096ee7c510002b9") });

与 $elemMatch 查询做同样的事情。

我可能遗漏了一些非常基本的东西,但如果你们能提供一些建议,我将不胜感激。

【问题讨论】:

  • 我刚刚意识到联系人不是一个数组,它是一个数字索引的对象..(假设从 php 数组转换负责) - 这会是问题吗?为什么它会返回任何东西呢?
  • contacts 是数字键控对象而不是数组这一事实绝对是这里的问题。这些查询不应该返回任何东西(当我在这些文档上尝试它们时也没有)。
  • 更正 - Rock Mongo 对此的解释不正确。我从控制台查看了数据,它是一个数组。更正了上面的代码。
  • 您在$elemMatch 查询中缺少},但除此之外,它现在按我预期的方式工作,这两个查询都返回了两个文档。
  • 谢谢,你是对的,我的实际文档要大得多,所以我简化了,这个例子很糟糕,因为它在这里工作,但不是我的实际数据。也许索引已损坏或其他原因。非常感谢您的帮助。

标签: mongodb mongodb-query


【解决方案1】:

原来这是应用层的问题,而不是 Mongo。其中一条记录是数字键控的,另一条则不是,我刚刚一直在使用 Rock Mongo,它似乎键控了所有数组。

感谢您的帮助 JohnnyHK

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2011-10-06
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多