根据嵌入式集合的多个标准获取文档

时间:2015-03-15 15:03:42

标签: mongodb

我有以下文档,我需要从嵌入式集合" 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代码中驱动它。我不知道我是否挖了更深的洞。

谢谢,

2 个答案:

答案 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)

您可以使用aggregation pipelines

db.sku.aggregate([
    {"$unwind": "$sku.items"},
    {"$group":  {"_id": "$_id", "items": {"$addToSet":{"_id": "$items._id"}}}},
    {"$match": {"items._id": {$all:[2,7]}}}
])