[{
  "username":"user1",
  "products":[
           {"productID":1,"itemCode":"CODE1"},
           {"productID":2,"itemCode":"CODE1"},
           {"productID":3,"itemCode":"CODE2"},
       ]
},
{
  "username":"user2",
  "products":[
           {"productID":1,"itemCode":"CODE1"},
           {"productID":2,"itemCode":"CODE2"},
       ]
}]

Я хочу найти все «productID» для «products» для «user1», чтобы «itemCode» для продукта был «CODE1».

Какой запрос в mongoDB нужно написать для этого?

6
Krisalay 6 Сен 2016 в 00:53

2 ответа

Лучший ответ

Если вам нужно выполнить только одно условие, то достаточно точечной записи. В оболочке Mongo:

db.col.find({"products.itemCode" : "CODE1", "username" : "user1"})

Это вернет всех пользователей с вложенными объектами продукта, имеющими itemCode "CODE1".

Обновлено

Сначала не было ясно о ваших требованиях, но это должно быть так.

Если вы хотите, чтобы каждый продукт был отдельной записью, вам нужно будет использовать совокупную структуру. Сначала разделите записи в массиве с помощью $unwind, затем используйте $match для своих условий.

db.col.aggregate(
  { $unwind: "$products" },
  { $match: { username: "user1", "products.itemCode": "CODE1" } }
);

Ответ:

{ "_id" : ObjectId("57cdf9c0f7f7ecd0f7ef81b6"), "username" : "user1", "products" : { "productID" : 1, "itemCode" : "CODE1" } }
{ "_id" : ObjectId("57cdf9c0f7f7ecd0f7ef81b6"), "username" : "user1", "products" : { "productID" : 2, "itemCode" : "CODE1" } }
5
SuleymanSah 5 Апр 2020 в 16:55

Для этого вам понадобится несколько фильтров, как показано ниже, что является не чем иным, как условием AND (при условии, что имя вашей коллекции - collection1)

db.collection1.find({"username":"user1", "products.itemCode" : "CODE1"})
0
Rahul 5 Сен 2016 в 23:21