Node.js Mongoose查询:如何查找对象数组

Node.js Mongoose查询:如何查找对象数组,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,如果您以以下格式发送json数据,服务器将尝试遍历mongodb的item文档,并编写代码,返回具有相同用户ID的数据以及itemTag接收到的完全相同的json数据 我有这个模式: var subSchema = mongoose.Schema({ main:Number, sub:Number, color:Number },{ _id : false }); var ItemSchema = new Schema({ userId:String, date:S

如果您以以下格式发送json数据,服务器将尝试遍历mongodb的item文档,并编写代码,返回具有相同用户ID的数据以及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 });
{ 
   "_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
       } 
    ] 
}
{ 
   "_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
       } 
    ] 
}

db数据:

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

var ItemSchema = new Schema({
    userId:String,
    date:String,
    itemTag: [subSchema]
}, { versionKey: false });
{ 
   "_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
       } 
    ] 
}
{ 
   "_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
       } 
    ] 
}
**和客户端发送json数据:** 服务器获取 req.body.userId req.body.itemTag

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

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

var ItemSchema = new Schema({
    userId:String,
    date:String,
    itemTag: [subSchema]
}, { versionKey: false });
{ 
   "_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
       } 
    ] 
}
{ 
   "_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
       } 
    ] 
}

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

itemTag.$.main
语法

要获取阵列中的第一项,可以使用:

itemTag.$0.main
对于数组中的第二项:

itemTag.$1.main
等等……

试试这个

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

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)

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

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

我不明白您想要实现什么,您能再解释一下吗?我想在db中找到与以下itemTag数组相同的值。{“ItemTag”:[{“Main”:3,“Sub”:7,“Color”:1},{“Main”:3,“Sub”:1,“Color”:11}}}谢谢。。但我收到了这样一条消息:{“消息”:“转换为数字失败,因为值\”[{main:3,sub:7,color:1},{main:4,sub:4,color:1}]\“路径\“main\”对于模型\“Item\”,“name”:“CastError”,“stringValue”:“\”[{main:3,sub:7,color:1},{main:4,sub:4,color:1}],“种类”:“数字”,请发布您正在执行的查询,并确保所有文档字段(“主”、“子”和“颜色”都是数字字段)