Mongodb 给定一个对象数组,如何根据数组的每个匹配项过滤数据库中现有对象的结果?
我有一个结构如下的集合:Mongodb 给定一个对象数组,如何根据数组的每个匹配项过滤数据库中现有对象的结果?,mongodb,Mongodb,我有一个结构如下的集合: { "toystore": 22, "toystore_name": "Toystore A", "toys": [ { "toy": "buzz", "code": 17001, "price": 500 }, { "toy": "woddy", "code": 17002, "price": 1000
{
"toystore": 22,
"toystore_name": "Toystore A",
"toys": [
{
"toy": "buzz",
"code": 17001,
"price": 500
},
{
"toy": "woddy",
"code": 17002,
"price": 1000
},
{
"toy": "pope",
"code": 17003,
"price": 300
}
]
},
{
"toystore": 11,
"toystore_name": "Toystore B",
"toys": [
{
"toy": "jessie",
"code": 17005,
"price": 500
},
{
"toy": "rex",
"code": 17006,
"price": 2000
}
]
}
]
我有n
玩具店,在每个玩具店中,我在toys
字段(是一个数组)中有该店提供的玩具
可能有重复的代码,我想搜索
[ { "toys.code": 17001 }, { "toys.code": 17003 }, { "toys.code": 17005 }, { "toys.code": 17005 }]
我希望每个玩具都能生成结果。code
无论它们是否重复,当前结果都不会重复(例如使用code17005
)
这是我当前的输出:
[
{
"_id": "Toystore A",
"toy_array": [
{
"price_original": 500,
"toy": "buzz"
},
{
"price_original": 300,
"toy": "pope"
}
]
},
{
"_id": "Toystore B",
"toy_array": [
//**********
//as i searched 2 times the code:17005, this object should be shown 2 times. only is showed 1 time.
{
"price_original": 500,
"toy": "jessie"
}
]
}
]
如何获得数组中每个匹配项的返回结果
这是我的现场代码:
db.collection.aggregate([
{
$unwind: "$toys"
},
{
$match: {
$or: [
{
"toys.code": 17001
},
{
"toys.code": 17003
},
{
"toys.code": 17005
},
{
"toys.code": 17005
}
],
}
},
{
$group: {
_id: "$toystore_name",
toy_array: {
$push: {
price_original: "$toys.price",
toy: "$toys.toy"
},
},
},
},
])
阶段,
$match
检查管道中的每个文档并评估提供的标准,或者删除文档,或者将其传递到下一阶段。它不会迭代匹配条件并检查每个文档的整个文档流,这是复制两次引用的文档所需要的
这是可以做到的,但是您需要在管道中传递两次代码数组,一次是为了消除根本不匹配的文档,另一次是为了允许您正在寻找的重复
所需的阶段是:
- $match消除没有任何所需玩具的玩具店
- $project使用
o$map以迭代搜索数组
o$filter用于选择匹配的玩具
o$reduce以消除空数组,并将条目重新组合到单个数组中 - 另外一个$project用于从toy_数组中删除代码
var codearray = [17001, 17003, 17005, 17005];
db.collection.aggregate([
{$match: {"toys.code": {$in: codearray }}},
{$project: {
_id: "$toystore_name",
toy_array: {
$reduce: {
input: {
$map: {
input: codearray,
as: "qcode",
in: {
$filter: {
input: "$toys",
as: "toy",
cond: {$eq: [ "$$toy.code","$$qcode" ]}
}
}
}
},
initialValue: [],
in: {
$cond: {
if: {$eq: ["$$this",[]]},
then: "$$value",
else: {$concatArrays: ["$$value", "$$this"]}
}
}
}
}
}},
{$project: {"toy_array.code": 0}}
])