Mongodb 基于嵌入式集合的多个条件获取文档

Mongodb 基于嵌入式集合的多个条件获取文档,mongodb,Mongodb,我有以下文档,我需要从嵌入的集合“items”中搜索多个项目 以下是单个SKU的示例 db.sku.findOne() { "_id" : NumberLong(1192), "description" : "Uploaded via CSV", "items" : [ { "_id" : NumberLong(2), "

我有以下文档,我需要从嵌入的集合“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由多个项目组成,所有组合都是唯一的,但一个项目将是多个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]}}}
])