Mongodb 基于嵌入式集合的多个条件获取文档
我有以下文档,我需要从嵌入的集合“items”中搜索多个项目 以下是单个SKU的示例Mongodb 基于嵌入式集合的多个条件获取文档,mongodb,Mongodb,我有以下文档,我需要从嵌入的集合“items”中搜索多个项目 以下是单个SKU的示例 db.sku.findOne() { "_id" : NumberLong(1192), "description" : "Uploaded via CSV", "items" : [ { "_id" : NumberLong(2), "
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由多个项目组成,所有组合都是唯一的,但一个项目将是多个Sku的一部分
我正在努力使用查询结构来获取我要查找的内容
以下是我尝试过的几件事:
db.sku.find({'items._id':2},{'items._id':7})
那个只返回id为7的项目
db.sku.find({items:{$all:[{_id:5}]}})
那个并没有返回任何东西,但它是在寻找解决方案时出现的。我发现了
下面是一个预期结果的示例:
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或items[1].id=10
组合使用…。然后项[1]。id=7
只能与项[2]组合。id=20
…以此类推
目标是简化我的购买规则,并从Sku代码中实现。我不知道我是否挖了一个更深的洞
谢谢,关于提取物品ID为2和7的
sku
,当我正确回忆时,您必须使用$elemMatch
:
db.sku.find({'items' :{ '$all' :[{ '$elemMatch':{ '_id' : 2 }},{'$elemMatch': { '_id' : 7 }}]}} )
它选择所有sku
,其中每个项目都有\u id
2和7。您可以使用
用更多信息更新了问题。我不确定是否遵循?我想返回Sku列表及其嵌入项列表。但是,是的,我只需要嵌入Sku的Id。itemsI只需要项目的唯一Id。但我认为,一旦我有了正确的列表开始,这一部分就会很简单。这看起来不错,但我运行了查询,没有收到任何结果。Sku除了7和2之外,还有其他项目吗?好的。是的,这就是整个PITA部分。我最初不会有所有的项目,但我需要开始缩小列表,以防止订单不匹配。基本上有2000个项目组合排列,只有625个是有效的。因此,根据最初的项目选择,可供后续选择的项目要少得多。我使用SKu作为我的规则逻辑,也许这是一个坏主意。这会向我返回看起来像可靠数据的东西。我想看看@Michael9的聚合函数将做什么,因为这可能会节省我的另一个步骤。但是,这个答案还是很有帮助的。我编辑了这个答案来修复一个不匹配的花括号,但除此之外,它很棒。
db.sku.aggregate([
{"$unwind": "$sku.items"},
{"$group": {"_id": "$_id", "items": {"$addToSet":{"_id": "$items._id"}}}},
{"$match": {"items._id": {$all:[2,7]}}}
])