我在尝试找到一个在其数组中具有特定值的特定元素时遇到了一些问题。
所以如果集合包含这样的对象:
{
"_id" : ObjectId("53408df830044f6b43e64904"),
"_class" : "my.path.Team",
"name" : "a name",
"listOfIds" : [
ObjectId("535044b93004ed4738ba3192"),
ObjectId("535044b93004ed4738bc3185")
],
"anotherId" : ObjectId("535044b93003ed4738b9317e"),
"yetAnotherId" : ObjectId("535044a22004ed4738b93101")
}
我需要在listOfIds中找到一个具有特定ObjectId的特定元素我以为我可以使用$ elemmatch但是它似乎没有在listOfIds内部的条目被命名的情况下工作......
我正在使用
db.team.findOne({anotherId: aVariableInScope.anotherId, listOfIds: { $elemMatch: { aVariableInScope._id }} });
但它不起作用,我似乎找到的所有示例都指向结构如下的数组:
"listOfIds" : [
"value": ObjectId("535044b93004ed4738ba3192"),
"value" :ObjectId("535044b93004ed4738bc3185")
],
然后你可以使用:
db.team.findOne({anotherId: aVariableInScope.anotherId, listOfIds: { $elemMatch: { "value" : aVariableInScope._id }} });
答案 0 :(得分:1)
您只需使用以下查询:
db.team.findOne({
anotherId: aVariableInScope.anotherId,
listOfIds: aVariableInScope._id
}
});
根据 docs ,仅当您尝试匹配数组元素上的多个字段时,才需要$ elemMatch。它之所以说'#34;期待一个对象"是$ elemMatch采用完整的mongo查询(例如,你可以传递的东西)作为它的论点。
答案 1 :(得分:1)
你可以做一场比赛:
db.team.findOne({
"anotherId": aVariableInScope.anotherId,
"listOfIds": {
"$elemMatch": {
"value": aVariableInScope._id
}
}
},
{
"_class": 1,
"name": 1,
"listOfIds.$": 1,
"anotherId": 1,
"yetAnotherId": 1
});
使用positional $
运算符来选择一个匹配元素。
或者对于倍数而言,只需使用.aggregate()
:
db.team.aggregate([
// Matching documents makes sense to reduce the result
{ "$match": {
"anotherId": aVariableInScope.anotherId,
"listOfIds": {
"$elemMatch": {
"value": aVariableInScope._id
}
}
},
// Unwind the array
{ "$unwind": "$listOfIds" },
// Actually match the members
{ "$match": {
"listOfIds.value": aVariableInScope._id
}},
// Group back again if you must
{ "$group": {
"_id": "$_id",
"_class": { "$first": "$class" },
"name": { "$first": "$name" },
"listOfIds": { "$push": "$listOfIds" },
"anotherId": { "$first": "$anotherId" },
"yetAnotherId": { "$first": "$yetAnotherId" }
}}
]);
涉及的内容越多,但与.find()
可用的内容不同,它会返回多个数组匹配。