"first_name" : [
]
我有上面的数据库。我想查找字段first_name和last_name有type = primary。我尝试了这段代码,但它获得了所有数据:
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) {
我该怎么办?提前谢谢
答案 0 :(得分:1)
通过将两个属性的值作为查询条件提供,您始终可以“匹配”包含这两个属性的文档。但是为了使位置匹配两者,你需要$filter
和aggregate:
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
]
}
}}
])
可以与标准查询一起使用的positional $
operator可以匹配数组中的“单个”元素。但是对于多个匹配,或者在这种情况下,匹配可以在每个数组中处于“不同”位置,那么需要使用$filter
的这种操作。另外使用$arrayElemAt
作为示例从数组中提取单个元素。
答案 1 :(得分:0)
根据MongoDB文档
The $elemMatch operator matches documents that contain an array
field with at least one element that matches all the specified query
criteria.
根据上述说明,请尝试在MongoDB shell中执行以下查询。
db.collection.find({first_name:{$elemMatch:{type:'primary'}},
last_name:{$elemMatch:{type:'primary'}}})