如何测试mongodb子文档中数组的每个元素
我拥有mongodb文档,其中包含以下数据:如何测试mongodb子文档中数组的每个元素,mongodb,mongodb-query,pymongo,Mongodb,Mongodb Query,Pymongo,我拥有mongodb文档,其中包含以下数据: amenities[ { amenity_id:52, Amenity:"AC" }, { amenity_id:23, Amenity:"Free Parking" } ] 我想将数组的每个舒适性\u id元素与特定值匹配,并使用条件$cond返回true或false。我曾经 "$project":{'Free Parking':{'$cond':{'if':{'$in':['amenities.ameni
amenities[
{
amenity_id:52,
Amenity:"AC"
},
{
amenity_id:23,
Amenity:"Free Parking"
}
]
我想将数组的每个舒适性\u id
元素与特定值匹配,并使用条件$cond
返回true或false。我曾经
"$project":{'Free Parking':{'$cond':{'if':{'$in':['amenities.amenityId',[23]]},'then':'True','else':'False'}}
如果文档包含amentity\u id=52
,则查询必须返回False。
无论menityId是什么,它都返回false。因此,可以在中使用
$列出设施Id。如何测试每个元素?考虑到您的输入集合是
[
{
amenities: [
{
_id: 52,
Amenity: "AC"
},
{
_id: 23,
Amenity: "Free Parking"
}
]
}
]
使用聚合管道$map
db.collection.aggregate([
{
$project: {
amenites: {
$map: {
input: "$amenities",
as: "item",
in: {
Amenity: "$$item.Amenity",
_id: "$$item._id",
isValid: {
$cond: {
if: {
$eq: [
"$$item._id",
23
]
},
then: true,
else: false
},
}
}
}
}
}
}
])
您将得到以下结果:
[
{
"amenites": [
{
"Amenity": "AC",
"_id": 52,
"isValid": false
},
{
"Amenity": "Free Parking",
"_id": 23,
"isValid": true
}
]
}
]
在mongodb中使用$unwind操作,它会将数组字段展开到多个文档中
请参考以下网址-
例:
将使用$unwind将其转换为以下内容:
[
{_id, field:1},
{_id, field:2},
{_id, field:3}
]
在$unwind
之后,您可以使用$in
查询运行匹配查询
例:
我能够通过在一个阶段收集所有id并在下一阶段将值与列表进行比较来解决这个问题。您是否查询符合条件的文档?还是做别的什么?使用$all可以在一个数组中找到满足多个条件的文档。为什么在一个位置有\u id
,但在代码中测试修正id
?我的错。我现在已经更新了问题。你仍然在一个地方有amentityid
,在另一个地方有amentity\u id
。我想知道这是否是您的问题的核心,但如果它起作用,我猜它在您的代码中是正确的,而在示例代码或文档中是不正确的。展开是不必要的,它现在会破坏原始文档。@AsyaKamsky聚合查询不会修改任何原始文档,而且它不会发生,您能告诉我有关您遇到的问题的更多详细信息吗?关键是,当您使用$unwind时,聚合管道会更改文档的数量及其形状(在管道中)——因此,在$unwind之后,无论您想对它们做什么,都会使用不同于存储在集合中的文档的操作。我不是说它对磁盘上的文档有任何作用,但是当问题是“如何为X测试文档”时,更改文档将不再返回他们想要测试的原始文档。
[
{_id, field:1},
{_id, field:2},
{_id, field:3}
]
{
$match: {
field: {$in: [1,2]}
}
}