我有以下文档,我需要从嵌入式集合" items"中搜索多个项目。
以下是单个SKU的示例
db.sku.findOne()
{
"_id" : NumberLong(1192),
"description" : "Uploaded via CSV",
"items" : [
{
"_id" : NumberLong(2),
"category" : DBRef("category", NumberLong(1)),
"description" : "840 tag visual",
"name" : "840 Visual Mini Round",
"version" : NumberLong(0)
},
{
"_id" : NumberLong(7),
"category" : DBRef("category", NumberLong(2)),
"description" : "Maxi",
"name" : "Maxi",
"version" : NumberLong(0)
},
{
"_id" : NumberLong(11),
"category" : DBRef("category", NumberLong(3)),
"description" : "Button",
"name" : "Button",
"version" : NumberLong(0)
},
{
"_id" : NumberLong(16),
"category" : DBRef("category", NumberLong(4)),
"customizationFields" : [
{
"_class" : "CustomizationField",
"_id" : NumberLong(1),
"displayText" : "Custom Print 1",
"fieldName" : "customPrint1",
"listOrder" : 1,
"maxInputLength" : 12,
"required" : false,
"version" : NumberLong(0)
},
{
"_class" : "CustomizationField",
"_id" : NumberLong(2),
"displayText" : "Custom Print 2",
"fieldName" : "customPrint2",
"listOrder" : 2,
"maxInputLength" : 17,
"required" : false,
"version" : NumberLong(0)
}
],
"description" : "2 custom lines of farm print",
"name" : "Custom 2",
"version" : NumberLong(2)
},
{
"_id" : NumberLong(20),
"category" : DBRef("category", NumberLong(5)),
"description" : "Color Red",
"name" : "Red",
"version" : NumberLong(0)
}
],
"skuCode" : "NF-USDA-XC2/SM-BC-R",
"version" : 0,
"webCowOptions" : "840miniwithcust2"
}
整个嵌入式集合中都有重复的items.id。每个Sku由多个项目组成,所有组合都是独一无二的,但是一个项目将成为许多Skus的一部分。
我正在努力寻找查询结构以获得我想要的东西。
以下是我尝试过的一些事情:
db.sku.find({'items._id':2},{'items._id':7})
那个只返回id为7的项目
db.sku.find({items:{$all:[{_id:5}]}})
那个人没有任何回报,但在寻找解决方案时却出现了。我发现了它in the MongoDB manual
以下是预期结果的示例:
sku:{ "_id" : NumberLong(1013),
"items" : [ { "_id" : NumberLong(5) },
{ "_id" : NumberLong(7) },
{ "_id" : NumberLong(12) },
{ "_id" : NumberLong(16) },
{ "_id" :NumberLong(2) } ] },
sku:
{ "_id" : NumberLong(1014),
"items" : [ { "_id" : NumberLong(5) },
{ "_id" : NumberLong(7) },
{ "_id" : NumberLong(2) },
{ "_id" : NumberLong(16) },
{ "_id" :NumberLong(24) } ] },
sku:
{ "_id" : NumberLong(1015),
"items" : [ { "_id" : NumberLong(5) },
{ "_id" : NumberLong(7) },
{ "_id" : NumberLong(12) },
{ "_id" : NumberLong(2) },
{ "_id" :NumberLong(5) } ] }
每个回来的Sku都有一个id:7和id:2的项目,以及他们拥有的任何其他项目。
为了进一步澄清,我的目的是确定在输入前几个项目后存在多少剩余组合。
基本上,客户将开始指定商品,我们会将其分解为剩余的有效组合。因此Sku.items[0].id=5
只能与items[1].id=7 or items[1].id=10
...结合使用。然后items[1].id=7
只能与items[2].id=20
...等结合
目标是简化我的购买规则,并从Sku代码中驱动它。我不知道我是否挖了更深的洞。
谢谢,
答案 0 :(得分:2)
在提取项目ID为2和7的sku
时,如果我没记错,您必须使用$elemMatch
:
db.sku.find({'items' :{ '$all' :[{ '$elemMatch':{ '_id' : 2 }},{'$elemMatch': { '_id' : 7 }}]}} )
选择sku
的所有item
,其中_id
为{{1}} 2和7。
答案 1 :(得分:1)
db.sku.aggregate([
{"$unwind": "$sku.items"},
{"$group": {"_id": "$_id", "items": {"$addToSet":{"_id": "$items._id"}}}},
{"$match": {"items._id": {$all:[2,7]}}}
])