Próbuję zwrócić dokument, a ten dokument powinien mieć tablicę filtrowaną tak, że zawiera tylko jeden element. Widziałem wiele podobnych pytań, ale żaden z nich nie zajmuje się dynamicznymi pytaniami. Może być kilka ograniczeń, więc muszę być w stanie dodawać do filtra.

{
  "_id" : ObjectId("6058f722e9e41a3d243258dc"),
  "fooName" : "foo1",
  "fooCode" : 1,
  "bar" : [
    {
      "barCode" : "123",
      "barName" : "Rick's Cafe",
      "baz" : [
        {
          "bazId" : "00",
          "bazDescription" : "Ilsa"
        },
        {
          "bazId" : "21",
          "bazDescription" : "Victor"
        }
      ]
    },
    {
      "barCode" : "456",
      "barName" : "Draco Tavern",
      "baz" : [
        {
          "bazId" : "00",
          "bazDescription" : "Rick Shumann"
        }
      ]
    }
  ]
}

Jest to moja próba, zwraca tablicę dokumentu, który zawiera kod kreskowy, a całą zawartość tablicy są wliczone w cenę.

Expression<Func<Foo, bool>> filter = x => x.FooCode == 1;

string barCode = "456"
if (!String.IsNullOrEmpty(barCode))
{
  Expression<Func<Foo, bool>> newPred =
    x => x.Bar.Any(s => s.BarCode == barCode);
  filter = filter.CombineAnd(newPred);
}

var fooQuery =
  _fooCollection
    .Find(filter);

Jak usunąć nie pasujące elementy tablicy, ale tylko wtedy, gdy określono element tablicy?

2
Rick DeBay 24 marzec 2021, 23:12

2 odpowiedzi

Najlepsza odpowiedź
  1. Unwind Aby przekonwertować pojedynczy dokument do dokumentu na element gniazda zagnieżdżonego w kształcie:
{
  "_id" : ObjectId("6058f722e9e41a3d243258dc"),
  "fooName" : "foo1",
  "fooCode" : 1,
  "bar": {
    "barCode" : "123",
    "barName" : "Rick's Cafe",
    ...
  }
}
  1. Match Aby znaleźć żądany element
  2. Group do rekombinacji zagnieżdżonej tablicy

Więc wynikiem C # może wyglądać jak:

var fooQuery = _fooCollection.Aggregate()
                .Unwind("bar")
                .Match(BsonDocument.Parse("{ 'bar.barcode': '"+ barCode + "'}"))
                .Group(BsonDocument.Parse("{​​​​​ '_id':'$fooCode' }​​​​​"))
0
BSSchwarzkopf 25 marzec 2021, 16:29

Musisz używać agregatu w MongoDB. Możesz podzielić elementy tablicy za pomocą Reflectind , filtruj za pomocą Mecz , wybierz klawisze, które chcesz, z projekt i grupa Z wspólną kolumną jak id lub coś takiego.

MongoDB Agregation Docs: https://docs.mongodb.com/manual/aggregation/

0
Eagleclaw 24 marzec 2021, 20:22