MongoDB:仅检索特定记录[重复]

Posted

技术标签:

【中文标题】MongoDB:仅检索特定记录[重复]【英文标题】:MongoDB: Retrieving only specific record [duplicate] 【发布时间】:2016-04-18 10:21:30 【问题描述】:

我是 Mongo 的新手,我正在尝试从 find() 查询中检索多个同名的特定数据:

让我解释一下-> 用户收藏有以下文件:

"linkedaccounts": [
  
    "accountname": "Rani Charan",
    "accountnumber": "10815748690065",
    "ifsc": "UTIB0001081",
    "virtualid": "taran@xyz",
    "_id": "571488b9720023940539959e",
    "isDefaultReceiving": false,
    "isDefaultFunding": false,
    "isAppEnabled": false,
    "aeba": false,
    "accountsource": 0
  ,
  
    "accountname": "Rani Singh",
    "accountnumber": "01316366360080",
    "virtualid": "ranisingh@xyz",
    "_id": "571488b972002394053995a0",
    "ifsc": "UTIB0000131",
    "isDefaultReceiving": false,
    "isDefaultFunding": true,
    "isAppEnabled": true,
    "aeba": false,
    "accountsource": 0
  ,
  
    "accountname": "Rani K Singh",
    "accountnumber": "07916956560873",
    "virtualid": "ranik@xyz",
    "_id": "571488b9720023940539959f",
    "ifsc": "UTIB0000791",
    "isDefaultReceiving": true,
    "isDefaultFunding": false,
    "isAppEnabled": true,
    "aeba": false,
    "accountsource": 0
  
]

现在我想获取虚拟 ID 为 "ranisingh@xyz" 的帐号和 ifsc 代码。我能够使用此查询获得一些过滤后的数据:

db.users.find(
         "linkedaccounts.virtualid": "ranik@xyz", 
         _id: 0, 'linkedaccounts.accountnumber': 1,'linkedaccounts.ifsc': 1)

但结果我得到了所有三个帐号和 ifsc 代码。像这样:-


    "linkedaccounts" : [
            
                    "accountnumber" : "10815748690065",
                    "ifsc" : "UTIB0001081"
            ,
            
                    "accountnumber" : "01316366360080",
                    "ifsc" : "UTIB0000131"
            ,
            
                    "accountnumber" : "07916956560873",
                    "ifsc" : "UTIB0000791"
            
    ]

所以现在我只想打印一个属于“ranisingh@xyz”的帐号和 ifsc 代码。

【问题讨论】:

【参考方案1】:

您可以使用 $slice 从数组中获取第一个元素:

 db.users.find(
  "linkedaccounts.virtualid": "ranik@xyz" ,
  
    _id: 0,     
   linkedaccounts: $elemMatch: virtualid:"ranik@xyz"
   
);

但要重塑文档,您需要像这样使用聚合:

   db.users.aggregate([
   $unwind:"$linkedaccounts",
   $match:"linkedaccounts.virtualid":"ranik@xyz",
   $project:
       _id:0,
       linkedaccounts:
            accountnumber:"$linkedaccounts.accountnumber",
                      ifsc:"$linkedaccounts.ifsc"       
       
   ])

【讨论】:

没有效果,同样的结果先生。 @profesor79 @SunnyDhiman 嗨 - 感谢反馈 - 刚刚意识到有额外的 - 现在已修复 @profesor79 我不认为这会有所帮助 - 我们不想要数组中的第一项,我们想要与查询条件匹配的任何一项。 OP 只问一个,没有其他规格 嗨@profesor79 thnks 查询-但它总是提供第一个帐号和ifsc,我的要求是我想根据我在“”中提供的虚拟ID 获取数据,例如ranisingh@xyz。【参考方案2】:

您可以使用“位置 $ 运算符”使其仅返回匹配的子文档,而不是数组中的所有子文档。试试这个:

db.users.find(
  "linkedaccounts.virtualid": "ranik@xyz" ,
  
    _id: 0, 
    'linkedaccounts.$.accountnumber': 1,
    'linkedaccounts.$.ifsc': 1
   
);

这应该只返回匹配的子文档,如下所示:


  _id: ObjectId("564b16849408a50b00ec235e"),
  "linkedaccounts" : [
    
      "accountnumber" : "07916956560873",
      "ifsc" : "UTIB0000791"
    
  ]

参考:https://docs.mongodb.org/manual/reference/operator/projection/positional/#proj.S

回复 cmets 的更新:这不起作用,因为这种类型的查询仅限于使用位置 $ 运算符。我建议改用聚合管道。

【讨论】:

"errmsg" : "每个查询不能指定多个位置项目。", 啊,是的,这是一个限制。我认为您可能需要使用聚合管道的强大功能来获得您想要的结果。 不需要聚合 - 我的查询就足够了 ;-) - 请尝试一下 嗨 vincebowdren 有错误:错误:错误: "waitedMS" : NumberLong(0), "ok" : 0, "errmsg" : "Positional projection 'linkedaccount.$.accountnumber' 没有与查询文档不匹配。", "code" : 2 @SunnyDhiman - 这个答案不起作用;正如professor79 所提到的,这种类型的投影有一个限制,即每次查询不能使用多个位置投影仪。但我认为您遇到的错误是由于拼写错误:“linkedaccount”而不是“linkedaccounts”。

以上是关于MongoDB:仅检索特定记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何仅获取数组中的元素-mongodb [重复]

在这种特定情况下,如何使用 SQL 仅检索与日期字段的最后一个值相关的记录?

mongodb学习记录

如果仅在 MongoDB 中满足特定条件,则分组

MongoDB 记录所有查询

mongodb用户权限操作常用命令