我想使用我的数组字段第0个值来使用Mongo aggregate $ lookup查询在销售文档中查找匹配项。这是我的疑问:
db.products.aggregate([
{
$match : { _id:ObjectId("57c6957fb190ecc02e8b456b") }
},
{
$lookup : {
from : 'sale',
localField: 'categories.0',
foreignField: 'saleCategoryId',
as : 'pcSales'
}
}]);
结果:
{
"_id" : ObjectId("57c6957fb190ecc02e8b456b"),
"categories" : [
"57c54f0db190ec430d8b4571"
],
"pcSales" : [
{
"_id" : ObjectId("57c7df5f30fb6eacb3810d1b"),
"Title" : "Latest Arrivals",
}
]}
此查询将返回一个匹配但是当我检查它不匹配时。我不知道为什么会发生这种情况,当我从查询中删除第0部分时它返回空白数组。 像这样:
{
"_id" : ObjectId("57c6957fb190ecc02e8b456b"),
"categories" : [
"57c54f0db190ec430d8b4571"
],
"pcSales" : []
}
saleCategoryId也是一个数组字段,其中包含categoriesKey数组。
请帮忙。
答案 0 :(得分:5)
由于您的MATCH (n) WHERE EXISTS(n.name) WITH (n) SKIP 0 LIMIT 50000 SET n.name=n.name;
MATCH (n) WHERE EXISTS(n.name) WITH (n) SKIP 50000 LIMIT 50000 SET n.name=n.name;
MATCH (n) WHERE EXISTS(n.name) WITH (n) SKIP 100000 LIMIT 50000 SET n.name=n.name;
// ...
是一个数组,因此您需要在查找之前向管道添加 $unwind
阶段,或使用 {{3} $arrayElemAt
管道步骤中的以获取数组中的实际元素。
以下是两个示例,其中一个使用 $project
运算符:
localField
并使用 $arrayElemAt
在应用 $unwind
管道之前先展平数组数组:
db.products.aggregate([
{ "$match" : { "_id": ObjectId("57c6957fb190ecc02e8b456b") } },
{
"$project": {
"category": { "$arrayElemAt": [ "$categories", 0 ] }
}
},
{
"$lookup": {
from : 'sale',
localField: 'category',
foreignField: 'saleCategoryId',
as : 'pcSales'
}
}
]);