gpt4 book ai didi

MongoDB 根据多个条件从数组中选择

转载 作者:行者123 更新时间:2023-12-02 20:13:16 25 4
gpt4 key购买 nike

我有以下结构(这是不能改变的,那就是我必须使用):

{
"_id" : ObjectId("abc123"),
"notreallyusedfields" : "dontcare",
"data" : [
{
"value" : "value1",
"otherSomtimesInterestingFields": 1
"type" : ObjectId("asd123=type1"),
},
{
"value" : "value2",
"otherSometimesInterestingFields": 1
"type" : ObjectId("asd1234=type2"),
},
many others
]
}

所以基本上模式的字段位于数组内,可以根据 1 个数组元素内的类型字段来识别它们(1 个模式字段,其值是数组中的 1 个元素)。对我来说这很奇怪,但我是 NoSQL 新手,所以这可能没问题。 (同样对于不同的数据,某些字段可能会丢失,并且不保证数据数组中的元素顺序)

也许这样更容易理解:表 a:类型 1 列 |类型 2 列 |等等(这些都像上面一样存储在数组中)

我的问题是:如何选择带有条件的多个字段?我的意思是(在 SQL 中): SELECT * FROM table WHERE type1=value1 AND type2=value2

我可以这样选择 1: db.a.find( {"data.type":ObjectId("asd1234=type2"), "data.value":value2}).pretty()

但我不知道如何包含 type1=value1 甚至更多条件。我认为这甚至不好,因为它可以匹配数组内的任何 data.value 字段,因此这并不意味着类型为 type2 的情况下值必须为 value2。

你会如何解决这个问题?

我正在考虑对 1 个条件执行 1 个查询,然后根据结果执行另一个查询。因此,类似于聚合管道之类的东西,但据我所知, $match 不能在聚合中使用多次。我想有一种方法可以管道化这些命令,但这非常丑陋。我缺少什么?或者由于数据的结构,我必须执行这些奇怪的多个查询?

我还查看了 $filter,但那里的条件也适用于数组的任何元素。 (或者我做错了)

谢谢!

抱歉,如果我不够清楚!请询问,我可以详细说明。

(基本上我想要基于此结构( Retrieve only the queried element in an object array in MongoDB collection )做的是:如果形状是方形,则过滤蓝色,如果形状是圆形,则过滤红色 === 如果类型是 type1 value 必须是 value1,如果 type 是 type2 value 必须是 value2)

最佳答案

可以这样做:

db.document.find( { $and: [ 
{ type:ObjectId('abc') },
{ data: { $elemMatch: { type: a, value: DBRef(...)}}},
{ data: { $elemMatch: { type: b, value: "string"}}}
] } ).pretty()

因此,您可以使用 $and 添加任意数量的“条件”,这样您就可以指定一个元素必须具有类型 a 和值 b,另一个元素必须具有类型 b 和值 c...

如果您只想投影匹配的元素,则使用带过滤器的聚合:

db.document.aggregate([
{$match: { $and: [
{ type:ObjectId('a') },
{ data: { $elemMatch: { Type: ObjectId("b"), value: DBRef(...)}}},
{ data: { $elemMatch: { Type: ObjectId("c"), value: "abc"}}}
] }
},
{$project: {
metadata: {
$filter: {
input: "$data",
as: "data",
cond: { $or: [
{$eq: [ "$$data.Type", ObjectId("a") ] },
{$eq: [ "$$data.Type", ObjectId("b") ] }]}
}
}
}
}
]).pretty()

这非常丑陋,所以如果有更好的方法请发布!谢谢!

关于MongoDB 根据多个条件从数组中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53051094/

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