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:仅检索特定记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章