Mongodb 在单独的数组中查找具有相同值的两个字段
我有上面这样的数据库。我希望查找字段first_name和last_name的type=primary。我尝试了此代码,但它获取了所有数据:Mongodb 在单独的数组中查找具有相同值的两个字段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有上面这样的数据库。我希望查找字段first_name和last_name的type=primary。我尝试了此代码,但它获取了所有数据: "first_name" : [ ] 我该怎么做呢。提前感谢通过向两个属性提供值作为查询条件,您可以始终“匹配”包含这两个属性的文档。但要获得与两者的位置匹配,您需要使用aggregate: var fieledUsers = { 'first_name': 1, 'last_name': 1
"first_name" : [
]
我该怎么做呢。提前感谢通过向两个属性提供值作为查询条件,您可以始终“匹配”包含这两个属性的文档。但要获得与两者的位置匹配,您需要使用aggregate:
var fieledUsers = {
'first_name': 1,
'last_name': 1,
};
var matching = {
'first_name.type' :'primary',
'last_name.type' :'primary'
}
var conditionUsers = {"_id": users_id};
db.collection('users').aggregate([{$project:fieledUsers},{$match:matching}],function (err, resUsers) {
可以与标准查询一起使用的元素可以很好地匹配数组中的“单个”元素。但是对于多个匹配,或者在这种情况下,匹配可以在每个数组中处于“不同”的位置,则需要对进行这种操作。还以从数组中提取单个元素为例。根据MongoDB文档
db.collection.aggregate([
{ "$match": {
"_id": users_id,
"first_name.type": "primary",
"last_name.type": "primary"
}},
{ "$addFields": {
"first_name": {
"$arrayElemAt": [
{ "$filter": {
"input": "$first_name",
"as": "el",
"cond": { "$eq": [ "$$el.type", "primary" ] }
}},
0
]
},
"last_name": {
"$arrayElemAt": [
{ "$filter": {
"input": "$last_name",
"as": "el",
"cond": { "$eq": [ "$$el.type", "primary" ] }
}},
0
]
}
}}
])
根据上述描述,作为解决方案,请尝试在MongoDB shell中执行以下查询
The $elemMatch operator matches documents that contain an array
field with at least one element that matches all the specified query
criteria.
谢谢,成功了。但它得到数据库中的所有数据,我只想得到名字和姓氏的文件。我该怎么办it@ThanhTùng如果您只需要这些字段,请使用而不是。这实际上不是
$elemMatch
的用途。相反,它的用途是在“多个条件”上匹配单个元素,通常作为多个属性。因此,OP和我自己使用的“查询”部分是正确的,也是最佳的。正如前面提到的问题,因此“问题”是for投影只返回“匹配的第一个位置”。因此,对于“两个”数组,一个数组中匹配的位置可能与另一个数组中的位置不同。因此,问题不在于匹配“文档”,因为该部分已经完成。问题是关于。“匹配数组元素”。MongoDB需要$filter
才能返回正确的响应。
db.collection.find({first_name:{$elemMatch:{type:'primary'}},
last_name:{$elemMatch:{type:'primary'}}})