【问题标题】:MongoDB: Select document from a list of documents based on criteriaMongoDB:根据条件从文档列表中选择文档
【发布时间】:2020-10-13 07:51:04
【问题描述】:

我收藏了chats。每个chat 都有一个members 的列表(数组)。每个member 都有两个字段:user_idrank(都是整数)。给定chat_iduser_id,我需要在给定聊天中获取指定成员的rank。我的查询应该是什么样的?

示例:

给定数据库内容:

[{
  "_id": {
    "$oid": "5f84ffad51d91fa6247b17e6"
  },
  "chat_id": 1,
  "status": true,
  "members": [
    {
      "user_id": 178291450,
      "rank": 1
    },
    {
      "user_id": 618121637,
      "rank": 0
    }
  ]
}]

我想在与chat_id: 1 的聊天中获得user_id: 178291450 用户的rank(应该是1)。

我试过这个:

chats.find({ "chat_id": event.chat_id, "members.user_id": int(admin) }, { _id: 0, members: { $elemMatch: { "members.user_id": int(admin) } } })

(来自我的 Python 代码,其中event.chat_id 是所需的chat_id,而admin 等于178291450), 但这不会返回任何内容 ({})。

【问题讨论】:

  • 这能回答你的问题吗? MongoDB filter nested array
  • @AlexisG 确实如此,但我设法找到了一个更简单、更短的解决方案。

标签: mongodb mongodb-query


【解决方案1】:

试试下面的查询。仅匹配用户 ID 的项目排名。

chats.find({ "chat_id": event.chat_id, "members.user_id": int(admin) }, { _id: 0,  "members.$.rank"})

【讨论】:

  • 此语法在 MongoDB 4.4 中似乎无效。
【解决方案2】:

我稍微改变了我的初始查询(来自问题),这很有效:

db.chats.find({"chat_id": 1}, {"_id" : 0, "members" : {"$elemMatch" : {"user_id" : {"$eq" : 618121637}}}})

1618121637 是样本 ID)

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2020-04-10
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2019-07-25
    • 2020-08-04
    相关资源
    最近更新 更多