Mongoose Query:如何查找对象数组

时间:2017-03-05 15:24:34

标签: node.js mongodb mongoose

如果您使用以下格式发送json数据,服务器会尝试浏览mongodb的项目文档,并编写返回具有相同userId的数据的代码以及itemTag收到的完全相同的json数据。

我有这个架构:

var subSchema = mongoose.Schema({
  main:Number,
  sub:Number,
  color:Number
},{ _id : false });

var ItemSchema = new Schema({
    userId:String,
    date:String,
    itemTag: [subSchema]
}, { versionKey: false });

db data:

{ 
   "_id" : ObjectId("58ba81eea341c37ed7268703"),
   "date" : "20170304_175923", 
   "userId" : "aaa", 
   "itemTag" : [ 
       { 
           "main" : 3, 
           "sub" : 7,  
           "color" : 1
       }, { 
           "main" : 3, 
           "sub" : 1,  
           "color" : 11
       }, { 
           "main" : 4, 
           "sub" : 4,  
           "color" : 1
       }, {
           "main" : 5, 
           "sub" : 2,  
           "color" : 1
       } 
    ] 
},
{ 
   "_id" : ObjectId("58ba81eea341c37ed7268723"),
   "date" : "20170305_125923", 
   "userId" : "aaa", 
   "itemTag" : [ 
       { 
           "main" : 3, 
           "sub" : 7,  
           "color" : 1

       }, { 
           "main" : 2, 
           "sub" : 2,
           "color" : 2
       } 
    ] 
}

**和客户端发送json数据:** 服务器得到 req.body.userId req.body.itemTag

{ 
    "userId":"aaa",
    "itemTag":[{
        "main":3,
        "sub":7,
        "color":1
    },{
        "main":4,
        "sub":4,
        "color":1
    }]
}

我希望得到:

{ 
   "_id" : ObjectId("58ba81eea341c37ed7268703"),
   "date" : "20170304_175923", 
   "userId" : "aaa", 
   "itemTag" : [ 
       { 
           "main" : 3, 
           "sub" : 7,  
           "color" : 1
       }, { 
           "main" : 3, 
           "sub" : 1,  
           "color" : 11
       }, { 
           "main" : 4, 
           "sub" : 4,  
           "color" : 1
       }, {
           "main" : 5, 
           "sub" : 2,  
           "color" : 1
       } 
    ] 
}

3 个答案:

答案 0 :(得分:0)

我不确定,但您应该使用:

itemTag.$.main语法

要获取数组中的第一项,您可以使用:

itemTag.$0.main

对于数组中的第二项:

itemTag.$1.main

依旧.......

答案 1 :(得分:0)

试试这个

   db.collection.find(
        {"userId" : req.body.userId,"itemTag.main" : req.body.itemTag},
        {itemTag : 1,userId:1})
        .sort(sortQuery)
        .skip(skipPage)
        .limit(16)

OR

 db.collection.find(
        {"userId" : req.body.userId,"itemTag":{ "$elemMatch" : {main : req.body.itemTag}}},
        {itemTag : 1,userId:1})
        .sort(sortQuery)
        .skip(skipPage)
        .limit(16)



//Note : In collection you need to write your collectionName

3) - 如果你想要数组中的特定元素

db.collection.find(
  {"userId" : req.body.userId,"itemTag":{ "$elemMatch" : {main : req.body.itemTag}}},
     {"itemTag.$.main"  : 1,userId:1})
     .sort(sortQuery)
    .skip(skipPage)
    .limit(16)

答案 2 :(得分:0)

您可以尝试以下查找查询。查询使用$all$elemMatch在数组中的每个值都有条目时返回行。

var rItemTag = req.body.itemTag
var qItemTag = rItemTag.map(value => ({"elemMatch": value}));
db.collection.find({itemTag: {$all: qItemTag}})