Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取mongodb深度嵌入的文档id_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

如何获取mongodb深度嵌入的文档id

如何获取mongodb深度嵌入的文档id,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有下面的mongo文档,它是名为attributes的更大文档的一部分,它也有颜色和大小 > db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty() { "_id" : ObjectId("543261cda14c971132fa2b91"), "values" : [ { "source" : [ {

我有下面的mongo文档,它是名为attributes的更大文档的一部分,它也有颜色和大小

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty()
{
    "_id" : ObjectId("543261cda14c971132fa2b91"),
    "values" : [
        {
            "source" : [
                {
                     "_id" : ObjectId("543261cda14c971132fa2b79"),
                     "name" : {
                         "en-UK" : "Combed Cotton"
                     }
                },
            ],
            "name" : [
                {
                    "_id" : ObjectId("543261cda14c971132fa2b85"),
                    "name" : {
                        "en-UK" : "Brushed 3-ply"
                    }
               },
               {
                   "_id" : ObjectId("543261cda14c971132fa2b8f"),
                   "name" : {
                       "en-UK" : "Plain Weave"
                   }
               }, 
               {
                   "_id" : ObjectId("543261cda14c971132fa2b90"),
                   "name" : {
                        "en-UK" : "1x1 Rib"
                    }
               }
           ] 
       }
   ],
   "name" : { 
       "en-UK" : "Fabric"
   }
}

我正在尝试返回子文档的_id,并具有以下内容:

db.attributes.aggregate([
   { '$match': {'name.en-UK': 'Fabric'} },
   { '$unwind' : '$values' },
   { '$project': { 'name' : '$values.name'} }, 
   { '$match': { '$and': [{"name.name.en-UK" : "1x1 Rib"} ] }}
])
正确的方法是什么

另外,
Fabric
的值是一个包含两项的数组,
source
name
,但是如果我像这样填充它:

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty()
{
    "_id" : ObjectId("543261cda14c971132fa2b91"),
    "values" : {
            "source" : [{ ... }]
            "name": [{ ... }]
    }
}
我得到以下错误

“errmsg”:“异常:$unwind:字段路径末尾的值必须是数组”

但是如果我把它放在一个方括号里,这就行了,所以

> db.attributes.find({'name': {'en-UK': 'Fabric'}}).pretty()
{
    "_id" : ObjectId("543261cda14c971132fa2b91"),
    "values" : [{
            "source" : [{ ... }],
            "name": [{ ... }]
    }]
}
作为
我缺少的是一个由两个对象组成的数组,
名称
每个对象都包含一个数组列表

非常感谢的任何建议

您在这里似乎“缺少”的是,您的文档中的“部分”要么根本不包含“值”属性,要么至少它是“非数组”。这是给出的错误的基本上下文

幸运的是,有几种方法可以解决这个问题。也就是说,在提交原始查询时“测试”是否存在数组。或者在处理管道时用缺少的元素替换某种数组

这两种方法实际上都是多余的,因为第一种情况确实解决了这一问题:

db.attributes.aggregate([
{“$match”:{
“英国名称”:“织物”,
“values.0”:{“$exists”:true}
}},
{“$project”:{
“名称”:1,
“值”:{“$ifNull”:[“$values”,[]]
}},
{“$unwind”:“$values”},
{“$unwind”:“$values.name”},
{“$match”:{“values.name.name.en UK”:“1x1肋骨”}
])
正如我所说。真正冗余的是,初始的
$match
实际上询问“初始数组元素”是否确实存在。这意味着那里有一个数组

第二阶段实际上使用操作符“填充”一个值(或者基本上是一个空数组),其中被测试元素不存在。我们之前对此进行了测试,但这表明了不同的方法


但是,如果您的文档没有您想要处理的预期数据,那么基本的想法id可能是“避免”或“填充”。这就是你出错的原因。

对不起,我得到一个空结果,
{“result”:[],“ok”:1}
@khinester你没有让它变得简单。下次提交时,请从帖子中删除“tab”字符。用重要的行编辑。