gpt4 book ai didi

arrays - 如何使用多条件查找查询在 MongoDB 中指定字段?

转载 作者:可可西里 更新时间:2023-11-01 10:09:11 25 4
gpt4 key购买 nike

这是单个文档:

{
_id: "...",
firstName: "john",
lastName:"Doe",
cars: [
{
"_id": "...",
"carName": "BMW",
"carModel": "330",
"carColor": "silver"
},
{
"_id": "...",
"carName": "Lexus",
"carModel": "IS300",
"carColor": "white"
},
{
"_id": "...",
"carName": "LADA",
"carModel": "2106",
"carColor": "blue"
}
]
}

我正在尝试仅选择 John's BMW 的“carColor”。像这样:

db.persons.findOne(
{ "firstName": "John", "cars.carName": "BMW" },
{ "_id": 0, "cars.$.carColor": 1 }
);

但是这个查询会像这样返回完整的对象:

{
cars: [
{
"_id": "...",
"carName": "BMW",
"carModel": "330",
"carColor": "silver"
}
}

我已经在没有 .$ 的情况下尝试了不同的查询。符号:

db.persons.findOne(
{ "firstName": "John", "cars.carName": "BMW" },
{ "_id": 0, "cars.carColor": 1 }
);

此版本仅返回“carColor”属性,但不过滤“carName”。像这样:

{
cars: [
{
"carColor": "silver"
},
{
"carColor": "white"
},
{
"carColor": "blue"
}
]
}

有什么想法吗?

最佳答案

为什么它不起作用?

{"firstName": "John", "cars.carName": "BMW"}

的意思是“名字是 john 且 cars 数组中至少有一个条目的 carName 是“BMW””。但它返回完整的文档,没有过滤数组。

{ "_id": 0, "cars.carColor": 1 }

不转换 _id,但转换 cars 数组所有条目的 carColor。

解决方案

事实上,您无法通过查找和投影方法准确地实现您想要的。你能做的更好的是添加 $ projection operator像这样:

db.collection.find({
firstName: "john",
"cars.carName": "BMW"
},
{
_id: 0,
"cars.$": 1
})

**RESULT**

[
{
"cars": [
{
"_id": "...",
"carColor": "silver",
"carModel": "330",
"carName": "BMW"
}
]
}
]

但是这种方法有缺点:

  • 你得到整个数组条目,而不仅仅是你想要/需要的颜色
  • 它只返回第一个匹配条目:如果 john 有 2 辆 BMW,则只返回一个。

更好的解决方案

幸运的是,MongoDB 提供了另一种方法来实现这一点,即聚合框架和 $filter运算符(operator):

db.collection.aggregate([
{
$match: {
firstName: "john"
}
},
{
$project: {
cars: {
$filter: {
input: "$cars",
as: "cars",
cond: {
$eq: [
"$$cars.carName",
"BMW"
]
}
}
}
}
},
{
$project: {
_id: 0,
"colors": "$cars.carColor"
}
}
])

You can try it here.

编辑:其他解决方案

你也可以尝试这个,放松/小组阶段:

db.collection.aggregate([
{
$match: {
firstName: "john"
}
},
{
$unwind: "$cars"
},
{
$match: {
"cars.carName": "BMW"
}
},
{
$group: {
"_id": null,
colors: {
$push: "$cars.carColor"
}
}
}
])

关于arrays - 如何使用多条件查找查询在 MongoDB 中指定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52740767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com