2017-03-05 9 views
0

jsonデータを次の形式で送信すると、サーバーはmongodbのアイテムドキュメントを調べ、同じuserIdとまったく同じjsonデータを持つデータを返すコードを書き込もうとしますitemTagで受信しました。Mongooseクエリ:オブジェクト配列の検索方法

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データ:

{ 
    "_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 
     } 
    ] 
} 
+0

私はあなたが達成したいことを理解していませんでした、あなたは再び説明できますか? –

+0

次のitemTag配列と同じ値をdb内で探したいと思います。 { "ItemTag":[{ "メイン":3、 "サブ":7、 "カラー":1 }、{ "メイン":3、 "サブ":1、 「カラー":11 } } – greatsk

答えて

0

下記の検索クエリを試すことができます。クエリでは$all$elemMatchを使用して、配列の各値のエントリがある場合に行を返します。

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

素晴らしい!出来た!ありがとう! – greatsk

0

は、私はわかりませんが、あなたは使用する必要があります。

itemTag.$.main構文

することができます配列内の最初の項目を取得するための使用:

itemTag.$0.main 
配列の2番目の項目について

:.......

0

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) 

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) 
+0

予期しないトークン.. – greatsk

+0

私の更新された回答を確認してください –

+0

ありがとう..私はこのメッセージを受け取りました:{ "メッセージに値をキャストしようとして失敗しました\ {[メイン:3、サブ:7、カラー:1}、{メイン:4、サブ:4、カラー:1}] \ "Item \" "のパス\" main \ ""、 "" name ":" CastError "、 " stringValue ":" {main:3、sub:7、color:1} "kind": "number"、 – greatsk

関連する問題